Oracle中按enquiry_id将多行数据合并为单行的SQL实现需求
Oracle 合并同一enquiry_id的多行数据为单行方案
假设你的源表结构类似(模拟附图中的数据结构):
enquiry_id | field_a | field_b -----------|---------|--------- 1001 | value1a | value1b 1001 | value2a | value2b 1002 | value3a | value3b
目标是将同一enquiry_id对应的1-2行数据合并为单行,输出格式如下:
enquiry_id | field_a_1 | field_b_1 | field_a_2 | field_b_2 -----------|-----------|-----------|-----------|----------- 1001 | value1a | value1b | value2a | value2b 1002 | value3a | value3b | NULL | NULL
以下是两种可行的SQL实现方案:
方案一:ROW_NUMBER() + 条件聚合(通用推荐)
通过CTE给每个enquiry_id下的行分配行号,再用条件聚合提取对应行的字段值:
WITH numbered_enquiries AS ( SELECT enquiry_id, field_a, field_b, -- 按实际业务规则排序,比如创建时间、字段值等,这里用field_a示例 ROW_NUMBER() OVER (PARTITION BY enquiry_id ORDER BY field_a) AS rn FROM enquiries ) SELECT enquiry_id, MAX(CASE WHEN rn = 1 THEN field_a END) AS field_a_1, MAX(CASE WHEN rn = 1 THEN field_b END) AS field_b_1, MAX(CASE WHEN rn = 2 THEN field_a END) AS field_a_2, MAX(CASE WHEN rn = 2 THEN field_b END) AS field_b_2 FROM numbered_enquiries GROUP BY enquiry_id ORDER BY enquiry_id;
说明
ROW_NUMBER()的ORDER BY子句需根据你的业务逻辑调整,确保行号分配符合预期- 条件聚合通过
MAX(CASE...)提取对应行号的字段值,无对应行时返回NULL
方案二:自连接(适用于最多两行的场景)
如果确认每个enquiry_id最多对应2条数据,可使用自连接简化查询:
SELECT e1.enquiry_id, e1.field_a AS field_a_1, e1.field_b AS field_b_1, e2.field_a AS field_a_2, e2.field_b AS field_b_2 FROM enquiries e1 LEFT JOIN enquiries e2 ON e1.enquiry_id = e2.enquiry_id AND e1.rowid <> e2.rowid WHERE e1.rowid = ( SELECT MIN(rowid) FROM enquiries WHERE enquiry_id = e1.enquiry_id ) ORDER BY e1.enquiry_id;
说明
- 用
MIN(rowid)锁定每个enquiry_id的首行作为主表e1 - 左连接同表
e2排除自身行,关联出第二行数据(如果存在)
内容的提问来源于stack exchange,提问作者LOKENDRA SINGH
相关产品推荐
相关产品推荐

