首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 資料表縱橫轉換:PIVOT 與 UNPIVOT 實戰範例

     編輯:關於SqlServer

場景說明

將「縱表」(長格式)轉為「橫表」(寬格式),或反之,常用於報表呈現、資料匯入匯出、ETL 轉換。

1. 縱表轉橫表(PIVOT)

原始資料:Table_A

目標結果

SQL 實作(CASE 聚合法,相容性最佳)

SELECT 
    Name,
    SUM(CASE WHEN Course = N'語文' THEN Grade ELSE 0 END) AS Chinese,
    SUM(CASE WHEN Course = N'數學' THEN Grade ELSE 0 END) AS Mathematics,
    SUM(CASE WHEN Course = N'英語' THEN Grade ELSE 0 END) AS English
FROM dbo.Table_A
GROUP BY Name;

替代方案:PIVOT 運算子(SQL 2005+)

SELECT Name, [語文] AS Chinese, [數學] AS Mathematics, [英語] AS English
FROM (
    SELECT Name, Course, Grade FROM Table_A
) AS SourceTable
PIVOT (
    SUM(Grade) FOR Course IN ([語文], [數學], [英語])
) AS PivotTable;

2. 橫表轉縱表(UNPIVOT)

原始資料:Table_B

目標結果

SQL 實作(UNION ALL 法,效能最佳)

SELECT Name, 'Chinese' AS Course, Chinese AS Score FROM Table_B
UNION ALL
SELECT Name, 'Mathematics' AS Course, Mathematics AS Score FROM Table_B
UNION ALL
SELECT Name, 'English' AS Course, English AS Score FROM Table_B
ORDER BY Name, Course DESC;

替代方案:UNPIVOT 運算子

SELECT Name, Course, Score
FROM Table_B
UNPIVOT (
    Score FOR Course IN (Chinese, Mathematics, English)
) AS UnpivotTable;

效能與選擇建議

方法優點缺點適用場景
CASE + GROUP BY相容所有版本、可控邏輯複雜度手動列舉欄位固定欄位、複雜轉換邏輯
PIVOT/UNPIVOT語法簡潔、標準化動態欄位需動態 SQL固定欄位、標準報表
UNION ALL效能最佳、無排序開銷程式碼重複大量資料、高頻轉換

動態欄位進階

若欄位不固定(如不確定科目),需構建動態 SQL:

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX);
SELECT @cols = STRING_AGG(QUOTENAME(Course), ',') FROM (SELECT DISTINCT Course FROM Table_A) t;
SET @sql = 'SELECT Name, ' + @cols + ' FROM Table_A PIVOT (SUM(Grade) FOR Course IN (' + @cols + ')) p';
EXEC sp_executesql @sql;

總結

縱橫轉換核心在於聚合邏輯與欄位展開。固定結構優先用 PIVOT/UNPIVOT 或 CASE 聚合;動態結構需動態 SQL;大數據量選 UNION ALL 避免排序開銷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved