使用case when,union all實現sql行轉列、列轉行
阿新 • • 發佈:2018-12-23
-- 建表
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
微信公眾號:程式國度