MySQL 行列轉換


原料:

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;

結果:
 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM