問題:使用case when實現行轉列
解決:
1、測試準備:
CREATE TABLE StudentScores(
UserName NVARCHAR2(20), --學生姓名
Subject NVARCHAR2(30), --科目
Score FLOAT --成績
);
2、準備數據:
INSERT INTO StudentScores values ('Nick', '語文', 80);
INSERT INTO StudentScores values ('Nick', '數學', 90);
INSERT INTO StudentScores values ('Nick', '英語', 70);
INSERT INTO StudentScores values ('Nick', '生物', 85);
INSERT INTO StudentScores values ('Kent', '語文', 80);
INSERT INTO StudentScores values ('Kent', '數學', 90);
INSERT INTO StudentScores values ('Kent', '英語', 70);
INSERT INTO StudentScores values ('Kent', '生物', 85);
commit;
目前的數據形式爲:
目標的數據形式:
3、實現方式:
SELECT
UserName,
MAX(CASE WHEN Subject='語文' THEN Score ELSE 0 END) AS "語文",
MAX(CASE WHEN Subject='數學' THEN Score ELSE 0 END) AS "數學",
MAX(CASE WHEN Subject='英語' THEN Score ELSE 0 END) AS "英語",
MAX(CASE WHEN Subject='生物' THEN Score ELSE 0 END) AS "生物"
FROM StudentScores
GROUP BY UserName;
討論:
實現上述需求的關鍵在於,多個case when與group by的配合使用;下面我們來
分析下sql的執行過程:
我們手下看下select子句,可以確定要查詢的結果集中有5列,username、語文、數學、英
語、生物;拿出表中第一條記錄多數據處理得出的結果集:
Username 語文 數學 英語 生物
Nick 80 0 0 0
80是由CASE WHEN Subject='語文' THEN Score ELSE 0 END得出,其他的0分別是由CASE WHEN
Subject='數學' THEN Score ELSE 0 END、CASE WHEN Subject='英語' THEN Score ELSE 0 END、
CASE WHEN Subject='生物' THEN Score ELSE 0 END得出,一次類推,得到的結果集爲
Username 語文 數學 英語 生物
Nick 80 0 0 0
Nike 0 90 0 0
Nike 0 0 70 0
Nike 0 0 0 85
Kent 80 0 0 0
Kent 0 90 0 0
Kent 0 0 70 0
Kent 0 0 0 85
下一步,聚合分組,最終完成任務。
令一種實現方式:
SELECT
UserName,
sum(decode(subject,'語文',score,0)) AS "語文",
sum(decode(subject,'數學',score,0)) AS "數學",
sum(decode(subject,'英語',score,0)) AS "英語",
sum(decode(subject,'生物',score,0)) AS "生物"
FROM StudentScores
GROUP BY UserName;
問題:實現列轉行
解決:
1、準備數據:
create table ScoresStudent as SELECT
UserName,
sum(decode(subject,'語文',score,0)) AS "語文",
sum(decode(subject,'數學',score,0)) AS "數學",
sum(decode(subject,'英語',score,0)) AS "英語",
sum(decode(subject,'生物',score,0)) AS "生物"
FROM StudentScores
GROUP BY UserName;
目前的數據形式:
目標數據形式:
2、實現方式:
select username,'語文' as subject,"語文" as score from ScoresStudent
union
select username,'數學' as subject,"數學" as score from ScoresStudent
union
select username,'英語' as subject,"英語" as score from ScoresStudent
union
select username,'生物' as subject,"生物" as score from ScoresStudent;