mysql行轉列 問題 SUM(IF(條件,列值,0))


 

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
復制代碼

 

 


免責聲明!

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



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