首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 單一 SQL 實現多行轉列:行轉列查詢最佳實踐

     編輯:Oracle 資料庫相關知識

業務場景

家庭信息表存儲學生與成員的多行記錄,需將同一學生的多個成員橫向展開為多列:

-- 源數據
ID  學生姓名  成員姓名
1   張三      成員1
2   張三      成員2
3   李四      成員1
4   李四      成員2

-- 目標顯示
學生姓名  成員姓名1  成員姓名2
張三      成員1      成員2
李四      成員1      成員2

核心 SQL 實現

SELECT 檔案編號,
       MAX(DECODE(my_seq, 1, 成員姓名)) 成員姓名1,
       MAX(DECODE(my_seq, 1, 與本人關系)) 與本人關系1,
       MAX(DECODE(my_seq, 2, 成員姓名)) 成員姓名2,
       MAX(DECODE(my_seq, 2, 與本人關系)) 與本人關系2
FROM (
    SELECT 檔案編號,
           成員姓名,
           與本人關系,
           ROW_NUMBER() OVER (PARTITION BY 檔案編號 ORDER BY 成員姓名) my_seq
    FROM v_insch_familyInfo
    WHERE 導入編號 = 17
)
GROUP BY 檔案編號;

關鍵技術點解析

  • ROW_NUMBER() 分析函數:按 檔案編號 分區,按 成員姓名 排序生成序號 my_seq(1、2…)。
  • DECODE 條件轉列:將序號為 1、2 的行分別映射到不同列。
  • MAX 聚合去重:同一 檔案編號 下每個序號僅有一行,MAX 將非空值「提取」出來,實現行轉列。

擴展思路

  • Oracle 11g+ 可使用 PIVOT 語法簡化寫法。
  • 動態列數未知時,需結合 PL/SQL 動態生成 SQL 或使用 XMLAGG 聚合為 XML 再解析。
  • 大數據量場景建議創建物化視圖預聚合,避免即時計算壓力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved