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

DB2 行轉列 (PIVOT) 實戰:CASE 聚合法與 MAX 技巧完整解析

     編輯:DB2 教學

業務場景

原始銷售明細表 SALES:

CREATE TABLE SALES (YEAR INT, QUARTER INT, RESULTS INT);

YEAR  QUARTER  RESULTS
2004      1        20
2004      2        30
2004      3        15
2004      4        10
2005      1        18
2005      2        40
2005      3        12
2005      4        27

目標:將季度由行轉為列,每年一行:

YEAR   Q1   Q2   Q3   Q4
2004   20   30   15   10
2005   18   40   12   27

標準解法:CASE 條件聚合 + GROUP BY

SELECT 
    YEAR,
    MAX(CASE WHEN QUARTER = 1 THEN RESULTS END) AS Q1,
    MAX(CASE WHEN QUARTER = 2 THEN RESULTS END) AS Q2,
    MAX(CASE WHEN QUARTER = 3 THEN RESULTS END) AS Q3,
    MAX(CASE WHEN QUARTER = 4 THEN RESULTS END) AS Q4
FROM SALES
GROUP BY YEAR
ORDER BY YEAR;

為什麼需要 MAX()?

CASE WHEN ... THEN RESULTS END 在不滿足條件時回傳 NULL。若不加聚合函數,GROUP BY YEAR 會產生多行(每季一行),非目標列顯示 NULL:

YEAR  Q1   Q2   Q3   Q4
2004  20  NULL NULL NULL
2004 NULL  30  NULL NULL
2004 NULL NULL  15  NULL
2004 NULL NULL NULL  10
...(共 8 行)

MAX() 將每組 (YEAR) 的四個季度值壓縮為單一行,因為每組內每季僅有一個非 NULL 值,MAX 正好取出該值。MIN()、SUM() 同理(前提是每組每季最多一筆)。

進階變體

動態列標題(需應用層組裝 SQL)

DB2 無原生 PIVOT 關鍵字,動態列需先查詢 distinct 季度,組裝 SQL 字串再 PREPARE/EXECUTE。

處理缺失季度:COALESCE 補零

COALESCE(MAX(CASE WHEN QUARTER = 1 THEN RESULTS END), 0) AS Q1

多指標同時轉換

SELECT YEAR,
       MAX(CASE WHEN QUARTER = 1 THEN SALES_AMT END) AS Q1_AMT,
       MAX(CASE WHEN QUARTER = 1 THEN UNITS END) AS Q1_UNITS,
       ...
FROM SALES_DTL
GROUP BY YEAR;

效能提示

  • 確保 (YEAR, QUARTER) 有索引,加速分群掃描。
  • 大數據量時,考慮先彙總至暫存表再 PIVOT,減少排序壓力。
  • DB2 11.5+ 支援 LISTAGG 字串聚合,可用於生成動態列清單輔助動態 PIVOT。

對比:行轉列 vs 列轉行

操作關鍵字/技巧典型用途
行轉列 (PIVOT)CASE + MAX/MIN/SUM + GROUP BY報表呈現、跨表比較
列轉行 (UNPIVOT)VALUES + TABLE() / UNION ALL規格化、ETL 轉換、明細展開
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved