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

DB2 常見問題解決方案集錦(一):交叉表實現與樞紐查詢

     編輯:DB2 教學

DB2 實現交叉表的標準作法

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) 有適當索引支援。
  • 替代方案:DB2 9.7+ 支援 PIVOT/UNPIVOT 相容語法(需啟用 Oracle 相容模式),但上述 CASE 作法跨版本通用。

此模式為 DB2 開發人員處理報表類轉置需求的基礎技能,靈活運用可解決多數交叉表呈現問題。

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