原始銷售明細表 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
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;
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() 同理(前提是每組每季最多一筆)。
DB2 無原生 PIVOT 關鍵字,動態列需先查詢 distinct 季度,組裝 SQL 字串再 PREPARE/EXECUTE。
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) 有索引,加速分群掃描。LISTAGG 字串聚合,可用於生成動態列清單輔助動態 PIVOT。| 操作 | 關鍵字/技巧 | 典型用途 |
|---|---|---|
| 行轉列 (PIVOT) | CASE + MAX/MIN/SUM + GROUP BY | 報表呈現、跨表比較 |
| 列轉行 (UNPIVOT) | VALUES + TABLE() / UNION ALL | 規格化、ETL 轉換、明細展開 |