變成
select userId,'語(yǔ)文' as subjectName,chinese_score as score from tb_score1
union all
select userId,'數(shù)學(xué)' as subjectName,math_score as score from tb_score1
union all
select userId,'英語(yǔ)' as subjectName,english_score as score from tb_score1
union all
select userId,'政治' as subjectName,politics_score as score from tb_score1;
-- 考察case表達(dá)式
select a.課程號(hào),b.課程名稱(chēng),
sum(case when 成績(jī) between 85 and 100 then 1 else 0 end) as '[100-85]',
sum(case when 成績(jī) >=70 and 成<85 then 1 else 0 end) as '[85-70]',
sum(case when 成績(jī)>=60 and 成績(jī)<70 then 1 else 0 end) as '[70-60]',
sum(case when 成績(jī)<60 then 1 else 0 end) as '[<60]'
from score as a right join course as b
on a.課程號(hào)=b.課程號(hào) group by a.課程號(hào),b.課程名稱(chēng);
-- 考察case表達(dá)式
select 課程號(hào),
sum(case when 成績(jī)>=60 then 1 else 0 end) as 及格人數(shù),
sum(case when 成績(jī) < 60 then 1 else 0 end) as 不及格人數(shù)
from score group by 課程號(hào);
轉(zhuǎn)化后
SELECT
userid,
SUM( CASE subjectName WHEN '語(yǔ)文' THEN score ELSE 0 END ) '語(yǔ)文',
SUM( CASE subjectName WHEN '數(shù)學(xué)' THEN score ELSE 0 END ) '數(shù)學(xué)',
SUM( CASE subjectName WHEN '英語(yǔ)' THEN score ELSE 0 END ) '英語(yǔ)',
SUM( CASE subjectName WHEN '政治' THEN score ELSE 0 END ) '政治'
FROM
tb_score
GROUP BY
userid;
SELECT
userid,
SUM( IF ( subjectName = '語(yǔ)文', score, 0 ) ) '語(yǔ)文',
SUM( IF ( subjectName = '數(shù)學(xué)', score, 0 ) ) '數(shù)學(xué)',
SUM( IF ( subjectName = '英語(yǔ)', score, 0 ) ) '英語(yǔ)',
SUM( IF ( subjectName = '政治', score, 0 ) ) '政治'
FROM
tb_score
GROUP BY
userid;
MySQL提供了 group by with rollup 函數(shù)進(jìn)行g(shù)roup by 字段的匯總,但是與order by 互斥的不能同時(shí)用。
SELECT
IFNULL( userid, 'total' ) AS userid,
SUM( IF ( subjectName = '語(yǔ)文', score, 0 ) ) '語(yǔ)文',
SUM( IF ( subjectName = '數(shù)學(xué)', score, 0 ) ) '數(shù)學(xué)',
SUM( IF ( subjectName = '英語(yǔ)', score, 0 ) ) '英語(yǔ)',
SUM( IF ( subjectName = '政治', score, 0 ) ) '政治',
SUM( IF ( subjectName = 'total', score, 0 ) ) AS 'total'
FROM
(
SELECT
userid,
IFNULL( subjectName, 'total' ) AS subjectName,
SUM( score ) AS score
FROM
tb_score
GROUP BY userid, subjectName WITH ROLLUP
) AS a
GROUP BY userid
WITH ROLLUP;
SELECT IFNULL(userid,'total') AS userid,
SUM(IF(subjectName='語(yǔ)文',score,0)) AS '語(yǔ)文',
SUM(IF(subjectName='數(shù)學(xué)',score,0)) AS '數(shù)學(xué)',
SUM(IF(subjectName='英語(yǔ)',score,0)) AS '英語(yǔ)',
SUM(IF(subjectName='政治',score,0)) AS '政治',
SUM(score) AS total
FROM tb_score
GROUP BY userid WITH ROLLUP;
SELECT userid,
SUM(IF(subjectName='語(yǔ)文',score,0)) AS '語(yǔ)文',
SUM(IF(subjectName='數(shù)學(xué)',score,0)) AS '數(shù)學(xué)',
SUM(IF(subjectName='英語(yǔ)',score,0)) AS '英語(yǔ)',
SUM(IF(subjectName='政治',score,0)) AS '政治',
SUM(score) AS total
FROM tb_score
GROUP BY userid
UNION
SELECT 'total',SUM(IF(subjectName='語(yǔ)文',score,0)) AS '語(yǔ)文',
SUM(IF(subjectName='數(shù)學(xué)',score,0)) AS '數(shù)學(xué)',
SUM(IF(subjectName='英語(yǔ)',score,0)) AS '英語(yǔ)',
SUM(IF(subjectName='政治',score,0)) AS '政治',
SUM(score) FROM tb_score;
SELECT userid,GROUP_CONCAT(`subjectName`,":",score)AS 成績(jī) FROM tb_score GROUP BY userid;