You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:32:14