SQL 解鎖 - Pivot vs Unpivot

DigNo Ape-avatar-img
發佈於SQL
更新 發佈閱讀 1 分鐘
在MS SQL Server 環境下,如何將sales_unpivot (表1)轉成 sales_pivot (表2)? 再將表2轉回表1?


表1

表1

表2

表2


PIVOT

這裡我們提供了三種方法:

  1. JOIN

這種方式可以通過將相同 regionproduct 的數據進行聯接,從而將不同季度的數據放在同一列。此方式相對簡單直接,對於數據量較小的資料表的情況適用。當季度數據增加時,SQL 語句變得冗長,效能可能會變差,每個季度都需要一個 JOIN

SELECT
t1.region,
t1.product,
t1.sales AS Q1_sales,
t2.sales AS Q2_sales,
t3.sales AS Q3_sales,
t4.sales AS Q4_sales
FROM
(SELECT * FROM sales_unpivot WHERE quarter = 'Q1') t1
JOIN
(SELECT * FROM sales_unpivot WHERE quarter = 'Q2') t2
ON t1.region = t2.region AND t1.product = t2.product
JOIN
(SELECT * FROM sales_unpivot WHERE quarter = 'Q3') t3
ON t1.region = t3.region AND t1.product = t3.product
JOIN
(SELECT * FROM sales_unpivot WHERE quarter = 'Q4') t4
ON t1.region = t4.region AND t1.product = t4.product
ORDER BY t1.region, t1.product;


  1. CASE WHEN

CASE WHEN 可以用來根據季度條件將數據放置到相應的列中。此方式靈活且通用,適用於任何數據庫系統。易於理解,對於有很多不同條件的數據進行處理很有用。如果你的 SQL 數據庫不支援 PIVOT,可以考慮 CASE WHEN 保持程式碼靈活。

SELECT
region,
product,
SUM(CASE WHEN quarter = 'Q1' THEN sales ELSE 0 END) AS Q1_sales,
SUM(CASE WHEN quarter = 'Q2' THEN sales ELSE 0 END) AS Q2_sales,
SUM(CASE WHEN quarter = 'Q3' THEN sales ELSE 0 END) AS Q3_sales,
SUM(CASE WHEN quarter = 'Q4' THEN sales ELSE 0 END) AS Q4_sales
FROM
sales_unpivot
GROUP BY
region, product
ORDER BY
region, product;


  1. PIVOT

PIVOT 是一種MS SQL Server 內建的 SQL 函數,專門用於產生樞紐分析表。簡潔且易於使用,在需要轉置多個欄位時最為高效。但並非所有的 SQL 數據庫都支持 PIVOT

SELECT 
region,
product,
[Q1] AS Q1_sales,
[Q2] AS Q2_sales,
[Q3] AS Q3_sales,
[Q4] AS Q4_sales
FROM
sales_unpivot
PIVOT (
SUM(sales)
FOR quarter IN ([Q1], [Q2], [Q3], [Q4])
) AS pivot_table
ORDER BY
region, product;


UNPIVOT

我們同樣提供了三種方法:

  1. UNION ALL

這是一種較為直觀的方式,你可以為每一個季度的銷售數據手動建立 SELECT 語句,然後將它們合併在一起。此方法適合數據列有限的情況,但當季度或欄位增多時,SQL 語句會變得冗長且難以維護。

SELECT 
region,
product,
'Q1' AS quarter,
Q1_sales AS sales
FROM
sales_pivot
UNION ALL
SELECT
region,
product,
'Q2' AS quarter,
Q2_sales AS sales
FROM
sales_pivot
UNION ALL
SELECT
region,
product,
'Q3' AS quarter,
Q3_sales AS sales
FROM
sales_pivot
UNION ALL
SELECT
region,
product,
'Q4' AS quarter,
Q4_sales AS sales
FROM
sales_pivot
ORDER BY
region, product, quarter;


  1. CROSS APPLY

CROSS APPLY 是另一種方法,它可以更靈活地處理數據。這種方式避免了使用多次的 SELECT 語句。

SELECT 
region,
product,
quarter,
sales
FROM
sales_pivot
CROSS APPLY (
VALUES
('Q1', Q1_sales),
('Q2', Q2_sales),
('Q3', Q3_sales),
('Q4', Q4_sales)
) AS quarters(quarter, sales)
ORDER BY
region, product, quarter;


  1. UNPIVOT

UNPIVOT 是一種MS SQL SERVER內建的 SQL 函數,可以用來將多個欄位旋轉成列,這是一個更為動態且簡潔的方法。UNPIVOT 將四個季度的銷售數據(Q1_sales, Q2_sales, Q3_sales, Q4_sales)變成兩個欄位,即 quartersales

SELECT 
region,
product,
quarter,
sales
FROM sales_pivot
UNPIVOT (
sales FOR quarter IN (Q1_sales, Q2_sales, Q3_sales, Q4_sales)
) AS unpivoted_table;




謝謝您花時間將此篇文章讀完,若覺得對您有幫助可以幫忙按個讚、分享來或是珍藏喔!也歡迎Follow我的Threads,持續追蹤生產力工具、商業分析、商業英文的實用範例,提升自己的職場力喔!

留言
avatar-img
留言分享你的想法!
avatar-img
DigNo Ape 數遊原人
58會員
138內容數
我們秉持著從原人進化的精神,不斷追求智慧的累積和工具的運用來提升生產力。我們相信,每一個成員都擁有無限的潛力,透過學習和實踐,不斷成長和進步。
DigNo Ape 數遊原人的其他內容
2025/03/10
我們先前介紹了SQL中如何根據指定的條件來篩選資料,僅返回符合條件的結果。本篇我們來討論於MS SQL Server 聚合函數(Aggregate Functions) ,用於對數據進行匯總計算,適合分析銷售總額、平均利潤等。
Thumbnail
2025/03/10
我們先前介紹了SQL中如何根據指定的條件來篩選資料,僅返回符合條件的結果。本篇我們來討論於MS SQL Server 聚合函數(Aggregate Functions) ,用於對數據進行匯總計算,適合分析銷售總額、平均利潤等。
Thumbnail
2024/11/26
OVER() 子句是Window Function的核心組成部分,用於在查詢結果集中定義一個「窗口」,使聚合函數或排名函數能夠在不改變原始數據結構的情況下,對特定資料進行計算。常搭配PARTITION BY將數據劃分成多個分群(類似GROUP BY,但不改變資料的結構、粒度),
Thumbnail
2024/11/26
OVER() 子句是Window Function的核心組成部分,用於在查詢結果集中定義一個「窗口」,使聚合函數或排名函數能夠在不改變原始數據結構的情況下,對特定資料進行計算。常搭配PARTITION BY將數據劃分成多個分群(類似GROUP BY,但不改變資料的結構、粒度),
Thumbnail
2024/09/20
SQL 中的 Index 是什麼? 加了以後會有什麼影響? 想像你在讀一本厚厚的小說,裡面有幾百頁。如果你想要找到某個關鍵情節,比如「主角第一次登場的地方」,如果你沒有做任何標記,你可能得從頭到尾翻書,直到找到那一頁為止,這樣會花很多時間。 ▌Index 就像書籤一樣
2024/09/20
SQL 中的 Index 是什麼? 加了以後會有什麼影響? 想像你在讀一本厚厚的小說,裡面有幾百頁。如果你想要找到某個關鍵情節,比如「主角第一次登場的地方」,如果你沒有做任何標記,你可能得從頭到尾翻書,直到找到那一頁為止,這樣會花很多時間。 ▌Index 就像書籤一樣
看更多
你可能也想看
Thumbnail
已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
Thumbnail
已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
Thumbnail
商業簡報不僅僅是呈現數據,更需要深入瞭解數據分析及有效的工具運用。本文探討於Excel中使用不同函數來改善數據處理效率,包括IF、IFS、VLOOKUP、XLOOKUP及INDEX與MATCH的結合,幫助商業人士更好地從數據中提取洞見,助力業務增值,學習優化數據分析過程,讓您的商業簡報更具影響力。
Thumbnail
商業簡報不僅僅是呈現數據,更需要深入瞭解數據分析及有效的工具運用。本文探討於Excel中使用不同函數來改善數據處理效率,包括IF、IFS、VLOOKUP、XLOOKUP及INDEX與MATCH的結合,幫助商業人士更好地從數據中提取洞見,助力業務增值,學習優化數據分析過程,讓您的商業簡報更具影響力。
Thumbnail
※ 別名: 目的在於提高SQL查詢的可讀性和簡潔性。 ※ 別名有兩種: Column Alias(列別名):在查詢結果中的某一列,取一個臨時的新名字。 Table Alias(表別名):給查詢中的表取一個短暫的新名字。 ※ Column Alias ※ 為什麼需要 Column A
Thumbnail
※ 別名: 目的在於提高SQL查詢的可讀性和簡潔性。 ※ 別名有兩種: Column Alias(列別名):在查詢結果中的某一列,取一個臨時的新名字。 Table Alias(表別名):給查詢中的表取一個短暫的新名字。 ※ Column Alias ※ 為什麼需要 Column A
Thumbnail
※ GROUP BY 用於將數據表中的數據按照一個或多個列進行分組。例如在處理一個表格的資料時,可以指定欄位,一個或是多個,然後把將其視為ID進行分組處理。 ※ 語法 SELECT column1, column2, ..., aggregate_function(column) FROM
Thumbnail
※ GROUP BY 用於將數據表中的數據按照一個或多個列進行分組。例如在處理一個表格的資料時,可以指定欄位,一個或是多個,然後把將其視為ID進行分組處理。 ※ 語法 SELECT column1, column2, ..., aggregate_function(column) FROM
Thumbnail
※ 語法 SELECT select_list FROM table_name​ ※ 解析順序 From:從哪裡拿? SELECT:要 "拿什麼" 資料? ※ 使用場景: Single column(單一欄位): Multiple column(多個欄位): All colu
Thumbnail
※ 語法 SELECT select_list FROM table_name​ ※ 解析順序 From:從哪裡拿? SELECT:要 "拿什麼" 資料? ※ 使用場景: Single column(單一欄位): Multiple column(多個欄位): All colu
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
在POWER QUERY從0到1 #6,就有介紹過資料合併這個功能。 #6 從0到1的POWER QUERY 資料合併 神似VLOOKUP但比他好用100倍 資料合併很神似函數的VLOOKUP,但除了單純以VLOOKUP方式查找合併資料之外,總共有6種不同的合併方式。 用一個簡單的範例來做
Thumbnail
在POWER QUERY從0到1 #6,就有介紹過資料合併這個功能。 #6 從0到1的POWER QUERY 資料合併 神似VLOOKUP但比他好用100倍 資料合併很神似函數的VLOOKUP,但除了單純以VLOOKUP方式查找合併資料之外,總共有6種不同的合併方式。 用一個簡單的範例來做
Thumbnail
題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們以原有的資料表為基礎,將資料表做樞紐轉換,垂直方向是月份,水平方向是不同的城市,而表格內容是該城市在某個月份的溫度。 題目的原文敘述 測試範例 Example 1: Input: +--------------+-
Thumbnail
題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們以原有的資料表為基礎,將資料表做樞紐轉換,垂直方向是月份,水平方向是不同的城市,而表格內容是該城市在某個月份的溫度。 題目的原文敘述 測試範例 Example 1: Input: +--------------+-
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News