SELECT userid, SUM(CASE `subject` WHEN '語(yǔ)文' THEN score ELSE 0 END) as '語(yǔ)文', SUM(CASE `subject` WHEN '數(shù)學(xué)' THEN score ELSE 0 END) as '數(shù)學(xué)', SUM(CASE `subject` WHEN '英語(yǔ)' THEN score ELSE 0 END) as '英語(yǔ)', SUM(CASE `subject` WHEN '政治' THEN score ELSE 0 END) as '政治' FROM tb_score GROUP BY userid 2、使用IF() 進(jìn)行行轉(zhuǎn)列:
SELECT userid, SUM(IF(`subject`='語(yǔ)文',score,0)) as '語(yǔ)文', SUM(IF(`subject`='數(shù)學(xué)',score,0)) as '數(shù)學(xué)', SUM(IF(`subject`='英語(yǔ)',score,0)) as '英語(yǔ)', SUM(IF(`subject`='政治',score,0)) as '政治' FROM tb_score GROUP BY userid 注意點(diǎn):
3、利用SUM(IF()) 生成列 + WITH ROLLUP 生成匯總行,并利用 IFNULL將匯總行標(biāo)題顯示為Total
SELECT IFNULL(userid,'total') AS userid, SUM(IF(`subject`='語(yǔ)文',score,0)) AS 語(yǔ)文, SUM(IF(`subject`='數(shù)學(xué)',score,0)) AS 數(shù)學(xué), SUM(IF(`subject`='英語(yǔ)',score,0)) AS 英語(yǔ), SUM(IF(`subject`='政治',score,0)) AS 政治, SUM(IF(`subject`='total',score,0)) AS total FROM( SELECT userid,IFNULL(`subject`,'total') AS `subject`,SUM(score) AS score FROM tb_score GROUP BY userid,`subject` WITH ROLLUP HAVING userid IS NOT NULL )AS A GROUP BY userid WITH ROLLUP;
4、利用SUM(IF()) 生成列 + UNION 生成匯總行,并利用 IFNULL將匯總行標(biāo)題顯示為 Total
SELECT userid, SUM(IF(`subject`='語(yǔ)文',score,0)) AS 語(yǔ)文, SUM(IF(`subject`='數(shù)學(xué)',score,0)) AS 數(shù)學(xué), SUM(IF(`subject`='英語(yǔ)',score,0)) AS 英語(yǔ), SUM(IF(`subject`='政治',score,0)) AS 政治, SUM(score) AS TOTAL FROM tb_score GROUP BY userid UNION SELECT 'TOTAL',SUM(IF(`subject`='語(yǔ)文',score,0)) AS 語(yǔ)文, SUM(IF(`subject`='數(shù)學(xué)',score,0)) AS 數(shù)學(xué), SUM(IF(`subject`='英語(yǔ)',score,0)) AS 英語(yǔ), SUM(IF(`subject`='政治',score,0)) AS 政治, SUM(score) FROM tb_score
5、利用SUM(IF()) 生成列,直接生成結(jié)果不再利用子查詢
SELECT IFNULL(userid,'TOTAL') AS userid, SUM(IF(`subject`='語(yǔ)文',score,0)) AS 語(yǔ)文, SUM(IF(`subject`='數(shù)學(xué)',score,0)) AS 數(shù)學(xué), SUM(IF(`subject`='英語(yǔ)',score,0)) AS 英語(yǔ), SUM(IF(`subject`='政治',score,0)) AS 政治, SUM(score) AS TOTAL FROM tb_score GROUP BY userid WITH ROLLUP;
6、動(dòng)態(tài),適用于列不確定情況
SET @EE=''; select @EE :=CONCAT(@EE,'sum(if(subject= /'',subject,'/',score,0)) as ',subject, ',') AS aa FROM (SELECT DISTINCT subject FROM tb_score) A ; SET @QQ = CONCAT('select ifnull(userid,/'TOTAL/')as userid,',@EE,' sum(score) as TOTAL from tb_score group by userid WITH ROLLUP'); -- SELECT @QQ; PREPARE stmt FROM @QQ; EXECUTE stmt; DEALLOCATE PREPARE stmt;
7、合并字段顯示:利用group_concat()
SELECT userid,GROUP_CONCAT(`subject`,":",score)AS 成績(jī) FROM tb_score GROUP BY userid