1. 程式人生 > 其它 >資料庫之 case關鍵字和 pivot使用,行列轉換實現

資料庫之 case關鍵字和 pivot使用,行列轉換實現

技術標籤:mysqlsqlmysqlsql

首先資料表為;

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
    欄位名代表的欄位值 end
    來完成, 參考文章:
    比較易懂, 詳細的資訊

分析:

  • 一。 首先我們知道, 數學,語文等, 是原表的 欄位值, 我們需要查詢出來,作為欄位名,所以要構造這些欄位名
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 不會。
    在這裡插入圖片描述

到這裡就先結束吧~