­

sql進階 – 行轉列

  • 2019 年 12 月 26 日
  • 筆記

用excel可以輕鬆實現行轉列,用sql怎麼實現呢?類似從圖一轉行成圖二的功能:

圖一:

圖二:

直接上程式碼。

建表語句:

CREATE TABLE `t_user_score` (  `id`  int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵' ,  `cname`  varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,  `cource`  varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,  `score`  int(11) NULL DEFAULT NULL ,  PRIMARY KEY (`id`)  )  ENGINE=InnoDB  DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci  ;  

插入測試數據:

INSERT INTO `t_user_score` ( `cname`, `cource`, `score`) VALUES ( '小許', '語文', '90');  INSERT INTO `t_user_score` ( `cname`, `cource`, `score`) VALUES ( '小許', '數學', '99');  INSERT INTO `t_user_score` ( `cname`, `cource`, `score`) VALUES ( '小許', '英語', '88');  INSERT INTO `t_user_score` ( `cname`, `cource`, `score`) VALUES ( '小張', '語文', '87');  INSERT INTO `t_user_score` ( `cname`, `cource`, `score`) VALUES ( '小張', '數學', '93');  INSERT INTO `t_user_score` ( `cname`, `cource`, `score`) VALUES ( '小張', '英語', '78');  

行轉列sql:

SELECT cname ,      sum(CASE cource WHEN '語文' THEN score ELSE 0 END ) as `語文`,      sum(CASE cource WHEN '數學' THEN score ELSE 0 END ) as `數學`,      sum(CASE cource WHEN '英語' THEN score ELSE 0 END ) as `英語`  FROM t_user_score  GROUP BY cname;