mysql行轉列解析

場景:mysq行列轉換,把個人和科目成績的情況放在一行展示,方便查看個人情況。(sql來說就是把一個重複列以及其對應關係的列,變成一行展示

===》

sql測試語句

DROP TABLE IF EXISTS `t_score`;
CREATE TABLE `t_score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) CHARACTER SET utf8 NOT NULL,
  `Subject` varchar(10) CHARACTER SET utf8 NOT NULL,
  `Fraction` double DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of t_score
-- ----------------------------
INSERT INTO `t_score` VALUES ('1', '王海', '語文', '86');
INSERT INTO `t_score` VALUES ('2', '王海', '數學', '83');
INSERT INTO `t_score` VALUES ('3', '王海', '英語', '93');
INSERT INTO `t_score` VALUES ('4', '陶俊', '語文', '88');
INSERT INTO `t_score` VALUES ('5', '陶俊', '數學', '84');
INSERT INTO `t_score` VALUES ('6', '陶俊', '英語', '94');
INSERT INTO `t_score` VALUES ('7', '劉可', '語文', '80');
INSERT INTO `t_score` VALUES ('8', '劉可', '數學', '86');
INSERT INTO `t_score` VALUES ('9', '劉可', '英語', '88');
INSERT INTO `t_score` VALUES ('10', '李春', '語文', '89');
INSERT INTO `t_score` VALUES ('11', '李春', '數學', '80');
INSERT INTO `t_score` VALUES ('12', '李春', '英語', '87');
INSERT INTO `t_score` VALUES ('13', '王海', '物理', '4');

這樣寫轉換sql

select 
  `name`,
       sum(if(Subject='語文',Fraction,0)) as 語文,
       sum(if(Subject='英語',Fraction,0)) as 英語,
       sum(if(Subject='數學',Fraction,0))as 數學
        from t_score group by name ;

先展示數據

轉換邏輯分析,sql先根據group by name分組,比如王海分組後是

1.name:王海,Subject 合併,Fraction合併

2.if(Subject='語文',Fraction,0)  遍歷。subject 判斷當前科目是不是語文,等於的話輸出Fraction對應的值,不等於的話輸出0

以語文爲例,語文與王海的其他科目相比,按順序:語文與語文,語文與數學,語文與英語,語文與物理

依次爲86,0,0,0

3.sum(if(Subject='語文',Fraction,0)) as 語文, 然後把所有的結果相加等於 86

4.所以就會有這樣的情況

(1)比如語文有多個

===》語文與語文,語文與數學,語文與英語,語文語文

結果爲,86,0,0,4   所以相加爲90

(2)sum(if(Subject='語文',Fraction,1000))不存在默認爲1000  會導致正常結果增加

select 
  `name`,
       sum(if(Subject='語文',Fraction,1000)) as 語文,
       sum(if(Subject='英語',Fraction,0)) as 英語,
       sum(if(Subject='數學',Fraction,0))as 數學
        from t_score group by name ;

結果:語文都增加了2000

分析,王海的,語文與語文,語文與數學,語文與英語,語文語文   結果爲 86,1000,1000,4  所以相加2090  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章