如何在Oracle SQL中将同报告同年度重复数据拆分为多列展示
Oracle SQL 实现同报告同年度重复数据同行展示
需求:查询同一份报告、同一年度内的重复数据,将重复数据以额外列的形式合并到同一行中,且每个报告对应的重复数据最多1条。
当前查询能筛选出存在重复的记录,但无法将同报告的两条记录合并为一行。以下是实现目标格式的方案:
解决方案思路
利用窗口函数ROW_NUMBER()为每个报告+年度分组内的记录分配序号,再通过自连接将序号1(主记录)和序号2(重复记录)的字段合并到同一行。
具体SQL语句
WITH ranked_data AS ( SELECT ID_PPAL_ICI AS report, BLNC_ID AS id_tip, BLNC_FEC_CIERRE AS date, BLNC_DUR AS duration, ID_PPAL_FNT AS source, BLNC_TIP AS tip, -- 按报告+年度分组,给每条记录分配序号,最新日期排第1 ROW_NUMBER() OVER ( PARTITION BY ID_PPAL_ICI, EXTRACT(YEAR FROM BLNC_FEC_CIERRE) ORDER BY BLNC_FEC_CIERRE DESC ) AS rn FROM BLNC_BALANCES INNER JOIN ID_PPAL ON BLNC_ID_PPAL_ICI = ID_PPAL_ICI ) SELECT r1.report, r1.id_tip, r1.date, r1.duration, r1.source, r1.tip, r2.id_tip AS id_tip_1, r2.date AS date_1, r2.duration AS duration_1, r2.source AS source_1, r2.tip AS tip_1 FROM ranked_data r1 LEFT JOIN ranked_data r2 ON r1.report = r2.report AND EXTRACT(YEAR FROM r1.date) = EXTRACT(YEAR FROM r2.date) AND r1.rn = 1 AND r2.rn = 2 WHERE r1.rn = 1; -- 只取每个组的主记录,合并重复记录作为附属列
语句说明
- CTE
ranked_data:给每个报告+年度内的记录按日期降序分配序号rn,序号1对应最新记录,序号2对应同组内的重复记录(因每个报告最多1条重复)。 - 自连接:将主记录(rn=1)和重复记录(rn=2)通过报告、年度关联,把重复记录的字段重命名为带
_1后缀的列。 - WHERE条件:只保留主记录行,确保每行对应一条报告的主记录+其关联的重复数据列。
执行该语句后,即可得到你期望的格式:同一行中同时展示主记录和对应的重复数据列。
内容的提问来源于stack exchange,提问作者Al.Vioky
相关产品推荐
相关产品推荐

