sum(if(條件,列值,0))語法用例:
select name,sum(if(subject="語文",score,0)) as “語文” from grade GROUP BY name
if中第一個參數為條件,符合條件的內容才會將第二個參數相加,不符合的內容將第三個參數相加。
第二個參數為要相加的參數,可以用常量,也可以用字段值。
第三個參數為條件為假時相加的值,通常設為0.
為了將行轉為列(這種操作一般用於統計),可使用如下語句:
select name,sum(if(subject="語文",score,0)) as “語文”,
sum(if(subject="數學",score,0)) as “數學”,sum(if(subject="英語",score,0)) as “英語”
from grade GROUP BY name
結果
mysql行列轉換
創建數據庫、表
create database tests; use tests; create table t_score( id int primary key auto_increment, name varchar(20) not null, #名字 Subject varchar(10) not null, #科目 Fraction double default 0 #分數 );
添加數據
INSERT INTO `t_score`(name,Subject,Fraction) VALUES ('王海', '語文', 86), ('王海', '數學', 83), ('王海', '英語', 93), ('陶俊', '語文', 88), ('陶俊', '數學', 84), ('陶俊', '英語', 94), ('劉可', '語文', 80), ('劉可', '數學', 86), ('劉可', '英語', 88), ('李春', '語文', 89), ('李春', '數學', 80), ('李春', '英語', 87);
方式一:使用if
select name as 名字 , sum(if(Subject='語文',Fraction,0)) as 語文, sum(if(Subject='數學',Fraction,0))as 數學, sum(if(Subject='英語',Fraction,0))as 英語, round(AVG(Fraction),2) as 平均分, SUM(Fraction) as 總分 from t_score group by name union select name as 名字 , sum(語文) Chinese,sum(數學) Math,sum(英語) English,round(AVG(總分),2)as 平均分,sum(總分) score from( select 'TOTAL' as name, sum(if(Subject='語文',Fraction,0)) as 語文, sum(if(Subject='數學',Fraction,0))as 數學, sum(if(Subject='英語',Fraction,0))as 英語, SUM(Fraction) as 總分 from t_score group by Subject )t
方式二:使用case
select name as Name, sum(case when Subject = '語文' then Fraction end) as Chinese, sum(case when Subject = '數學' then Fraction end) as Math, sum(case when Subject = '英語' then Fraction end) as English, sum(fraction)as score from t_score group by name UNION ALL select name as Name,sum(Chinese) as Chinese,sum(Math) as Math,sum(English) as English,sum(score) as score from( select 'TOTAL' as name, sum(case when Subject = '語文' then Fraction end) as Chinese, sum(case when Subject = '數學' then Fraction end) as Math, sum(case when Subject = '英語' then Fraction end) as English, sum(fraction)as score from t_score group by Subject)t
方法三: with rollup
select ifnull(name,'TOll') name, sum(if(Subject='語文',Fraction,0)) as 語文, sum(if(Subject='英語',Fraction,0)) as 英語, sum(if(Subject='數學',Fraction,0))as 數學, sum(Fraction) 總分 from t_score group by name with rollup
分類:
Mysql數據庫(二學年),
數據庫