首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 進階:行列轉換 實現資料透視查詢

     編輯:程式設計綜合問答

需求:將縱向儲存的資料(如:年份、月份、銷售額)轉為橫向報表(年份為行,月份為列),即經典的行列轉換 / 透視查詢。本文介紹標準 SQL 與各主流資料庫的實作語法。

範例資料

-- 原始表 sales
Year | Month | Amount
2023 | 1     | 1000
2023 | 2     | 1200
2023 | 3     | 1100
2024 | 1     | 1300
2024 | 2     | 1400

目標結果

Year | Jan | Feb | Mar | ...
2023 | 1000| 1200| 1100| ...
2024 | 1300| 1400|  0  | ...

標準 SQL (CASE + 聚合)

SELECT Year,
       SUM(CASE WHEN Month = 1 THEN Amount ELSE 0 END) AS Jan,
       SUM(CASE WHEN Month = 2 THEN Amount ELSE 0 END) AS Feb,
       SUM(CASE WHEN Month = 3 THEN Amount ELSE 0 END) AS Mar
FROM sales
GROUP BY Year;

優點:ANSI SQL 相容、所有資料庫通用。缺點:月份固定需硬編碼。

各資料庫專用語法

資料庫語法關鍵字範例
SQL ServerPIVOTSELECT * FROM sales PIVOT (SUM(Amount) FOR Month IN ([1],[2],[3])) AS pvt
OraclePIVOTSELECT * FROM sales PIVOT (SUM(Amount) FOR Month IN (1 AS Jan, 2 AS Feb))
PostgreSQLcrosstab (tablefunc 擴充)SELECT * FROM crosstab('SELECT Year, Month, Amount FROM sales') AS ct(Year int, Jan int, Feb int, Mar int)
MySQL無原生 PIVOT,用 CASE 或動態 SQL同標準 SQL;動態列需預處理語句構建
SQLiteCASE 聚合同標準 SQL

動態列透視(進階)

若月份不固定,需動態生成 SQL:

  1. 查詢所有 distinct 月份。
  2. 應用層或預存程序拼裝 CASE/PIVOT 子句。
  3. 執行動態 SQL(PREPARE/EXECUTE 或 sp_executesql)。

反轉換:Unpivot (橫轉縱)

-- SQL Server
SELECT Year, Month, Amount
FROM pvt_table
UNPIVOT (Amount FOR Month IN (Jan, Feb, Mar)) AS upvt;

工具輔助

  • BI 工具:Power BI、Tableau、Superset 拖拉即可完成透視。
  • Excel:樞紐分析表。
  • 線上轉換:CSV Pivot Tool。

提問者回饋:「這就叫做透視變換 自己谷歌下」。掌握 CASE聚合 通用寫法,再依資料庫優化為原生 PIVOT,即可應對大多數報表轉換需求。

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