【问题标题】:Combine Multiple Rows in one in Oracle在 Oracle 中将多行合二为一
【发布时间】:2019-09-05 15:32:18
【问题描述】:

我的oracle表数据如下:

ID  ColA   ColB   ColC    ColD   ColE   ColF
1   null   null   null      D1     E1    F1
1   A1     B1      C1      null   null   null 
1   A2     B2      C2      null   null   null 

我想要像

这样的记录
ID   ColA    ColB   ColC    ColD   ColE   ColF
1    A1      B1     C1      D1      E1     F1
1    A2      B2     C2      D1      E1     F1

基本上, 单个 ID 可以有多个 ColA 行,并且 ColD、E 和 F 将始终为空。 所以在所有 ID@ColA 组合中(ColA 不为空)我想用对应于 ColD、E 和 F 的相同 ID 的值填充 D、E 和 F,其中 ColA 为空

【问题讨论】:

    标签: oracle


    【解决方案1】:

    我可以在这里看到的一种可能的方法是在以下三个条件下自行加入您的表:

    • ID 值匹配
    • 连接左侧的ColAColBColC 值不是NULL,并且
    • 连接右侧的ColDColEColF 值不是NULL

    以下查询会起作用,至少对于您向我们展示的示例数据而言:

    SELECT
        t1.ID,
        t1.ColA,
        t1.ColB,
        t1.ColC,
        t2.ColD,
        t2.ColE,
        t2.ColF
    FROM yourTable t1
    LEFT JOIN yourTable t2
        ON t1.ID = t2.ID
    WHERE
        t1.ColA IS NOT NULL AND
        t1.ColB IS NOT NULL AND
        t1.ColC IS NOT NULL AND
        t2.ColD IS NOT NULL AND
        t2.ColE IS NOT NULL AND
        t2.ColF IS NOT NULL;
    

    Demo

    【讨论】:

    • 谢谢蒂姆。除了加入同一个表之外的任何其他方式,因为我发布的数据集是由多个涉及 UNION 的子查询形成的。所以我也不想搞砸性能。
    • 您现在问的是一个完全不同的问题,而不是您实际发布的问题。不,除了我使用的自联接方法之外,我没有看到任何其他方式来处理您的要求。
    【解决方案2】:

    您需要使用MAX 分析函数在空白COLDCOLECOLF 列中填写所有详细信息,然后需要where clause 从样本数据中过滤掉第一行COLACOLBCOLC 都是空值。

    尝试以下查询:

    SELECT
        *
    FROM
        (
            SELECT
                ID,
                COLA,
                COLB,
                COLC,
                MAX(COLD) OVER(
                    PARTITION BY ID
                ) AS COLD,
                MAX(COLE) OVER(
                    PARTITION BY ID
                ) AS COLE,
                MAX(COLF) OVER(
                    PARTITION BY ID
                ) AS COLF
            FROM
                YOUR_TABLE
        )
    WHERE
        COLA IS NOT NULL
        AND COLB IS NOT NULL
        AND COLC IS NOT NULL;
    

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多