1. 程式人生 > >使用case when,union all實現sql行轉列、列轉行

使用case when,union all實現sql行轉列、列轉行

--  建表
CREATE  TABLE StudentScores
(
   UserName         NVARCHAR(20),        -- 學生姓名
   Subject          NVARCHAR(30),        -- 科目
   Score            FLOAT               -- 成績
)

這裡寫圖片描述

-- 新增資料
INSERT INTO StudentScores SELECT '張三', '語文', 80 ;
INSERT INTO StudentScores SELECT '張三', '數學', 90 ;
INSERT INTO StudentScores SELECT '張三', '英語', 70 ;
INSERT INTO StudentScores SELECT '張三', '生物', 85 ;
INSERT INTO StudentScores SELECT '李四', '語文', 80 ;
INSERT INTO StudentScores SELECT '李四', '數學', 92 ;
INSERT INTO StudentScores SELECT '李四', '英語', 76 ;
INSERT INTO StudentScores SELECT '李四', '生物', 88 ;
INSERT INTO StudentScores SELECT '碼農', '語文', 60 ;
INSERT INTO StudentScores SELECT '碼農', '數學', 82 ;
INSERT INTO StudentScores SELECT '碼農', '英語', 96 ;
INSERT INTO StudentScores SELECT '碼農', '生物', 78 ;

-- 使用PIVOT行轉列
SELECT * FROM StudentScores 
AS P
PIVOT 
(
    SUM(Score) FOR 
    p.Subject IN ('語文','數學','英語','生物')
) AS T

--  使用case when行轉列
select UserName,
       max(case when subject='語文' then score else 0 end) 語文,
       max(case when subject='數學' then score else 0 end) 數學,
	   max(case when subject='英語' then score else 0 end) 英語,
	   max(case when subject='生物' then score else 0 end) 生物
from StudentScores
group by UserName

這裡寫圖片描述

-- 建表
drop table if exists StudentScores2;
CREATE  TABLE StudentScores2
(
   UserName         NVARCHAR(20),        -- 學生姓名
   語文             FLOAT,        -- 科目
   數學             FLOAT,        -- 科目
   英語             FLOAT,        -- 科目
   生物             FLOAT        -- 科目
);

-- 新增資料
insert into StudentScores2
 select UserName,
       max(case when subject='語文' then score else 0 end) 語文,
       max(case when subject='數學' then score else 0 end) 數學,
	   max(case when subject='英語' then score else 0 end) 英語,
	   max(case when subject='生物' then score else 0 end) 生物
from StudentScores
group by UserName;

這裡寫圖片描述

-- 使用union all 列轉行

select UserName,'語文' subject,語文 score
from StudentScores2
union all
select UserName,'數學' subject,數學 score
from StudentScores2
union all
select UserName,'英語' subject,英語 score
from StudentScores2
union all
select UserName,'生物' subject,生物 score
from StudentScores2;

這裡寫圖片描述

我的郵箱:[email protected]
我新建了一個大資料的學習交流群
QQ:2541692705
Q群:882855741

微信公眾號:程式國度
在這裡插入圖片描述