mysqlの行から列への分析

シナリオ:Mysqはランクと列を変換し、個人の状態を表示しやすくするために、個人のスコアと件名のスコアを1行に表示します。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は最初に名前でグループ化されます。たとえば、WangHaiのグループ化は

1.name:Wang Hai、Subjectが統合され、Fractionが統合されました

2. if(Subject = 'language'、Fraction、0)トラバース。現在の主題は、中国であるか否か被写体判断、それが等しい場合、出力値は、画分に対応する、それが等しくない場合、出力0

中国語を例にとると、王海の他の科目と比較して、順番に:中国語と中国語、中国語と数学、中国語と英語、中国語と物理学

順序は86、0、0、0です

3.sum(if(Subject = '语文'、Fraction、0))を言語として使用し、すべての結果を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を追加します。  

おすすめ

転載: blog.csdn.net/Mint6/article/details/94363684