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` ;
(2)SELECT
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步骤:(1)SELECT
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 ;
(3)SELECT studyCode,IFNULL(subjectS,'total'),SUM(score) FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP ;
作为子查询
(4)SELECT
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;