DB2 不支援 SQL Server 的 PIVOT 語法,但可透過 CASE 運算式搭配 MAX 聚合函數達成相同效果。此技巧適用於將「長表格」轉換為「寬表格」的報表需求。
假設視圖 data_view 包含三欄:location、metric、value,原始資料如下:
location1 PH 1.142575278063135
location1 Hg 0.0018310994140037379
location1 Fe 0.2974983113601452
location1 Mn 0.09548843270448454
location2 PH 6.096025515217242
location2 Hg 0.005575948698159294
location2 Fe 0.32657056877142043
location2 Mn 0.009418315198912612
SELECT location,
MAX(CASE WHEN metric = 'PH' THEN value END) AS PH,
MAX(CASE WHEN metric = 'Hg' THEN value END) AS Hg,
MAX(CASE WHEN metric = 'Fe' THEN value END) AS Fe,
MAX(CASE WHEN metric = 'Mn' THEN value END) AS Mn
FROM data_view
GROUP BY location;
LOCATION PH Hg Fe Mn
location1 1.142575278063135 0.0018310994140037379 0.2974983113601452 0.09548843270448454
location2 6.096025515217242 0.005575948698159294 0.32657056877142043 0.009418315198912612
CASE WHEN 依 metric 值篩選對應 value,不符合條件回傳 NULL。MAX() 聚合函數會忽略 NULL 值,保留唯一的非空數值。GROUP BY location 確保每個地點僅輸出一列。metric 值不固定,需動態生成 SQL(可透過應用程式或存儲過程組裝)。(location, metric) 有適當索引支援。PIVOT/UNPIVOT 相容語法(需啟用 Oracle 相容模式),但上述 CASE 作法跨版本通用。此模式為 DB2 開發人員處理報表類轉置需求的基礎技能,靈活運用可解決多數交叉表呈現問題。