家庭信息表存儲學生與成員的多行記錄,需將同一學生的多個成員橫向展開為多列:
-- 源數據
ID 學生姓名 成員姓名
1 張三 成員1
2 張三 成員2
3 李四 成員1
4 李四 成員2
-- 目標顯示
學生姓名 成員姓名1 成員姓名2
張三 成員1 成員2
李四 成員1 成員2
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 檔案編號;
檔案編號 分區,按 成員姓名 排序生成序號 my_seq(1、2…)。檔案編號 下每個序號僅有一行,MAX 將非空值「提取」出來,實現行轉列。PIVOT 語法簡化寫法。XMLAGG 聚合為 XML 再解析。