在Oracle中将多行合并为一行

在Oracle中将多行合并为一行,oracle,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

我有如下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)我想用ColD、E和F对应的值填充D、E和F,ColA为null的ID相同,这里我可以看到一种可能的方法是在以下三种条件下自联接表:

  • ID
    值匹配
  • 联接左侧的
    ColA
    ColB
    ColC
    值不是
    NULL
    ,并且
  • 联接右侧的
    ColD
    ColE
    ColF
    值不是
    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;


您需要使用
MAX
分析函数来填充空白
COLD
COLE
COLF
列中的所有详细信息,然后需要
where子句
从示例数据中筛选出第一行,其中
COLA
COLB
COLC
都是空的

请尝试以下查询:

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;

干杯

谢谢你,蒂姆。除了连接同一个表之外的任何其他方式,因为我发布的数据集是由涉及UNION的多个子查询组成的。所以我也不想把表演搞砸。你现在问的是一个完全不同的问题,而不是你实际发布的内容。不,除了我使用的自连接方法之外,我看不到任何其他方法来处理您的需求。