資料庫之 case關鍵字和 pivot使用,行列轉換實現
阿新 • • 發佈:2020-12-23
首先資料表為;
create TABLE S_score2(
id int PRIMARY KEY,
姓名 char(10),
課程 char(10) ,
分數 int
);
insert into S_score2
values(1, '張三', '語文' , 89),
(2, '張三', '數學' , 98),
(3, '張三', '英語' , 77),
(4, '李四', '語文' , 90),
(5, '李四', '數學' , 90);
- 查詢出來:
要求:
- 查詢結果如下:
我們會採用 case 欄位名 when 欄位值 then
來完成, 參考文章:
比較易懂, 詳細的資訊
分析:
- 一。 首先我們知道, 數學,語文等, 是原表的 欄位值, 我們需要查詢出來,作為欄位名,所以要構造這些欄位名
select 姓名,
CASE 課程
when '語文' then 分數 else 0 end as 語文,
CASE 課程
when '數學' then 分數 else 0 end as 數學,
CASE 課程
when '英語' then 分數 else 0 end as 英語
from S_score2;
- 結果:
- 分析
- 1.我們select 查詢語句後面構造出來了我們想要的欄位
- 2 當程式遍歷(select) 原表(S_score2) 中的每一條記錄時,按照我們的思路去輸出結果
- 首先 有一個 名字 欄位
- 然後 進入第一個 case欄位,通過 課程欄位的值,如果是 ‘語文’ ,那麼就給它的結果 是 對應本條記錄 分數字段的 值, 如果不是 ‘語文’,那麼 這個欄位的值,就給 0.
- 後面的 數學, 英語 相同
- 這樣執行也就出現了 每條記錄都有 語文,數學, 英語三個欄位了。
- 二。下一步,根據我們初步的結果,只需要使用聚合函式 SUM,就可以得到綜合的結果,應為 對應的每條記錄都是 0,只有一個欄位有值。
select 姓名,
sum(CASE 課程
when '語文' then 分數 else 0 end) as 語文,
sum(CASE 課程
when '數學' then 分數 else 0 end) as 數學,
sum(CASE 課程
when '英語' then 分數 else 0 end) as 英語
from S_score2 group by(姓名);
insert into S_score1
values(1, '張三', 90 , 89 , 70),
(2, '李四', 91 , 80 , 88);
select * from S_score1;
解決: 使用 集合操作 union, 資料111頁,交併差操作。
select 姓名,
'語文' as 課程,
語文 as 分數
from S_score1
union all
select 姓名,
'數學' as 課程,
數學 as 分數
from S_score1
union all
select 姓名,
'英語' as 課程,
英語 as 分數
from S_score1
order by 姓名 desc;
- 集合操作需要注意:
union 會自動去掉重複的元素,而 union all 不會。
到這裡就先結束吧~