在Oracle中将多行合并

时间:2019-09-05 04:50:35

标签: oracle

我有如下的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不为null的情况下)下,我都想用与相同ID的ColD,E和F对应的值(其中ColA为null)填充D,E和F

2 个答案:

答案 0 :(得分:0)

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

  • 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;

enter image description here

Demo

答案 1 :(得分:0)

您需要使用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;

干杯!