Oracle 11g XE数据库如何用SQL实现指定表格格式转换?
问题描述
我的Oracle 11g XE数据库中有如下表格数据:
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 Legacy ID 1234 9/1/2022 25035389 MT REC DEU BGD 123.76 0.558 9/1/2022 25035390 MT REC DEU BGD 123.76 0.558 9/1/2022 25035391 MT REC DEU BGD 123.76 0.558
期望得到如下格式的输出:
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 Legacy ID 1234 9/1/2022 1234 25035389 MT REC DEU BGD 123.76 9/1/2022 1234 25035389 0.558 9/1/2022 1234 25035390 MT REC DEU BGD 123.76 9/1/2022 1234 25035390 0.558 9/1/2022 1234 25035391 MT REC DEU BGD 123.76 9/1/2022 1234 25035391 0.558
请问如何通过SQL语句实现该需求?
解决方案
可以通过分析函数填充缺失值+拆分记录行的方式实现,具体SQL语句如下:
WITH filled_data AS ( -- 填充缺失的COL2值,获取上一个非空的COL2内容 SELECT COL1, LAST_VALUE(COL2 IGNORE NULLS) OVER (ORDER BY ROWNUM) AS COL2, COL3, COL4, COL5, COL6, COL7, COL8, ROWNUM AS rn FROM your_table_name ), split_rows AS ( -- 拆分出主记录行 SELECT COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8 FROM filled_data WHERE COL3 IS NOT NULL UNION ALL -- 拆分出对应0.558的附属行 SELECT fd.COL1, fd.COL2, fd.COL3, NULL AS COL4, sub.COL5 AS COL5, NULL AS COL6, NULL AS COL7, NULL AS COL8 FROM filled_data fd JOIN filled_data sub ON fd.rn = sub.rn - 1 WHERE sub.COL5 = '0.558' ) -- 按指定字段排序,保证输出顺序匹配期望 SELECT * FROM split_rows ORDER BY COL1, COL3;
关键步骤说明:
- 填充COL2:使用
LAST_VALUE(COL2 IGNORE NULLS) OVER (ORDER BY ROWNUM),按行号顺序将每行空的COL2自动填充为上一个非空的COL2值(即第一行的1234)。 - 拆分记录:通过
UNION ALL将主数据行和对应的0.558附属行合并,主行保留所有字段,附属行仅保留必要字段,其余置空。 - 排序输出:最后按COL1和COL3排序,确保输出顺序与期望一致。
注意:请将SQL中的your_table_name替换为你实际使用的表名。
内容的提问来源于stack exchange,提问作者Md. Sajjad Hussain
相关产品推荐
相关产品推荐

