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;
