SQL实现 列转行(MySQL中)

CREATE TABLE `grade` (

  `studyCode` varchar(20) NOT NULL DEFAULT '' COMMENT '学号',

  `subjectS` varchar(20) NOT NULL,

  `score` int(20) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `grade` VALUES ('001', '数学', '120');

INSERT INTO `grade` VALUES ('002', '数学', '130');

INSERT INTO `grade` VALUES ('003', '数学', '125');

INSERT INTO `grade` VALUES ('001', '英语', '130');

INSERT INTO `grade` VALUES ('002', '英语', '140');

INSERT INTO `grade` VALUES ('003', '英语', '135');

INSERT INTO `grade` VALUES ('001', '国学', '110');

INSERT INTO `grade` VALUES ('002', '国学', '136');

INSERT INTO `grade` VALUES ('003', '国学', '145');

SET FOREIGN_KEY_CHECKS=1;

一,纯 列转行

(1)SELECT  *  FROM `grade` ;

 

2SELECT  

studyCode 学号,

SUM(IF(subjectS = '国学',score,0)) 国学,

SUM(IF(subjectS = '数学',score,0)) 数学,

SUM(IF(subjectS = '英语',score,0)) 英语

   FROM grade

GROUP BY studyCode;

 

*使用CASE WHEN THEN ELSE END也可以

SELECT  

studyCode 学号,

SUM(CASE WHEN subjectS = '国学' THEN  score ELSE 0 END) 国学,

SUM(CASE WHEN subjectS = '数学' THEN  score ELSE 0 END) 数学,

SUM(CASE WHEN subjectS = '英语' THEN  score ELSE 0 END) 英语

   FROM grade

GROUP BY studyCode;

 

二,带统计的列转行(3种方式,A,B,C)

A步骤:(1SELECT

studyCode,subjectS,score FROM `grade`

GROUP BY studyCode,subjectS WITH ROLLUP ;

 

2

SELECT

studyCode,subjectS,SUM(score) FROM `grade`

GROUP BY studyCode,subjectS WITH ROLLUP ;

 

3SELECT studyCode,IFNULL(subjectS,'total'),SUM(score) FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP ;

 

作为子查询

4SELECT  

IFNULL(xh,'total') 学号,

SUM(IF(km like '%国学%',fs,0)) 国学,

SUM(IF(km like '%数学%',fs,0)) 数学,

SUM(IF(km like '%英语%',fs,0)) 英语,

SUM(IF(km like 'total',fs,0)) total

  from(

SELECT studyCode xh,IFNULL(subjectS,'total') km,SUM(score) fs FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP

HAVING studyCode IS NOT NULL

) A

GROUP BY xh with ROLLUP;

 

*存在数据库中的数据有时有空格,所以此处我用了like %% 模糊查询

SELECT  

IFNULL(xh,'total') 学号,

SUM(IF(km = '国学',fs,0)) 国学,

SUM(IF(km = '数学',fs,0)) 数学,

SUM(IF(km = '英语',fs,0)) 英语,

SUM(IF(km = 'total',fs,0)) total

  from(

SELECT studyCode xh,IFNULL(subjectS,'total') km,SUM(score) fs FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP

HAVING studyCode IS NOT NULL

) A

GROUP BY xh with ROLLUP;

数据没有空格,这样用。

B方案--利用SUM(IF()) 生成列,直接生成结果  (最简洁

select

ifnull(studyCode,'total')  '--',

SUM(IF(subjectS = '国学',score,0)) 国学,

SUM(IF(subjectS = '数学',score,0)) 数学,

SUM(IF(subjectS = '英语',score,0)) 英语,

SUM(score) AS TOTAL

from grade

group by studyCode with rollup ;

 

 

C方案--SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total

 

select studyCode,

SUM(IF(subjectS = '国学',score,0)) 国学,

SUM(IF(subjectS = '数学',score,0)) 数学,

SUM(IF(subjectS = '英语',score,0)) 英语,

SUM(score) AS TOTAL

from grade

group by studyCode

UNION

SELECT 'TOTAL',

SUM(IF(subjectS = '国学',score,0)) 国学,

SUM(IF(subjectS = '数学',score,0)) 数学,

SUM(IF(subjectS = '英语',score,0)) 英语,

SUM(score) AS TOTAL

FROM grade;

原文地址:https://www.cnblogs.com/mjbenkyo/p/7268242.html