原料:
create table t_score ( name varchar(20) , subject varchar(20), score float )
INSERT INTO `t_score` VALUES ('王海', '語文', '86'), ('王海', '數學', '83'), ('王海', '英語', '93'), ('陶俊', '語文', '88'), ('陶俊', '數學', '84'), ('陶俊', '英語', '94'), ('劉可', '語文', '80'), ('劉可', '數學', '86'), ('劉可', '英語', '88'), ('李春', '語文', '89'), ('李春', '數學', '80'), ('李春', '英語', '87');
查詢表的數據
select * from t_score;
要求實現的效果
實現方法:
select name 名字, max(case subject when '語文' then score end) '語文', max(case subject when '數學' then score end) '數學', max(case subject when '英語' then score end) '英語', sum(mark) score from t_score group by name;
# case subject when '語文' then score end
# 如果 subject 的值為 語文 時 取得相對應 的 成績值
# max( case subject when '語文' then score end)取得最大的值。
# 因為 使用 case subject when '語文' then score end 時 會生成 三條數據
#比如:
# 語文 數學 英語
# 80 null null
# title = subject,mark = score(懶得換字段名了。)

結果:

再查他們所有語文、數學、英語 成績的合計
select 'TOTAL', sum(case subject when '語文' then score end), sum(case subject when '數學' then score end), sum(case subject when '英語' then score end), sum(score) from t_score
結果:

合起來:
select name 名字, case subject when '語文' then score end '語文', max(case subject when '數學' then score end) '數學', max(case subject when '英語' then score end) '英語', sum( score ) score from t_score group by name union all select 'TOTAL', sum(case subject when '語文' then score end), sum(case subject when '數學' then score end), sum(case subject when '英語' then score end), sum( score ) from t_score;
結果:
