将多列值合并为一行

时间:2019-04-18 16:15:35

标签: oracle

我有如下数据,我想将具有空值的行与非空值的行合并。

ID    ColA    ColB      ColC     ColD
1     A1      B1        null     null
1     A2      B2        null     null
1     null    B3        C1       D1
2     A3      B3        null     null
3     null    null      C3       D3

预期结果:

ID  ColA   ColB    ColC     ColD
1   A1      B1     C1       D1
1   A2      B2     C1       D1
2   A3      B3     null     null
3   null    null   C3       D3

对于单个ID,基本上可以存在多行(不同的COLA),但只有一行ColA为空。

对于ColA不为空的行,ColC和ColD始终为空。

我想将ColA为空的行的ColB,ColC和ColD值与不为ColA的所有行合并。

2 个答案:

答案 0 :(得分:1)

一种方法是使用两个相关的子查询:

SELECT ID,ColA,ColB,
       (SELECT ColC FROM table y 
        WHERE x.id = y.id AND ColA IS NULL) As ColC,
       (SELECT ColD FROM table y 
        WHERE x.id = y.id AND ColA IS NULL) As ColD
FROM table x
WHERE ColA IS NOT NULL

另一种方法是使用自我联接

SELECT x.ID,x.ColA,x.ColB,
       y.ColC,y.ColD
FROM table x
JOIN table y
ON x.ID = y.ID AND x.ColA IS NOT NULL AND y.ColA IS NULL

编辑


  

如果对于特定ID,只有一行的ColA值不为空

我猜你的意思是对于特定的ID根本没有ColA = NULL的行。
在这种情况下,第一个查询将起作用,第二个查询必须使用LEFT JOIN:

SELECT x.ID,x.ColA,x.ColB,
       y.ColC,y.ColD
FROM table x
LEFT JOIN table y
ON x.ID = y.ID AND x.ColA IS NOT NULL AND y.ColA IS NULL

  

或只有空ColA的行

在这种情况下,必须使用NOT EXISTS子查询来扩展条件:

SELECT ID,ColA,ColB,
       (SELECT ColC FROM table y 
        WHERE x.id = y.id AND ColA IS NULL) As ColC,
       (SELECT ColD FROM table y 
        WHERE x.id = y.id AND ColA IS NULL) As ColD
FROM table x
WHERE ColA IS NOT NULL
  OR NOT EXISTS (
     SELECT 1 FROM table z
     WHERE  x.id = z.id AND z.ColA IS NOT NULL
  )

SELECT x.ID,x.ColA,x.ColB,
       y.ColC,y.ColD
FROM table x
LEFT JOIN table y
ON x.ID = y.ID AND y.ColA IS NULL
WHERE x.ColA IS NOT NULL 
   OR NOT EXISTS (
         SELECT 1 FROM table z
         WHERE  x.id = z.id AND z.ColA IS NOT NULL
      )

答案 1 :(得分:0)

您可以尝试以下方法:

SELECT filled.ID,
       filled.ColA,
       filled.ColB AS ColB_1,
       empty.ColB  AS ColB_2,
       empty.ColC,
       empty.ColD
FROM   my_table filled
JOIN   my_table empty
  ON   filled.ID = empty.ID
 AND   empty.ColA IS NULL
WHERE  filled.ColA IS NOT NULL;

如果带有LEFT OUTER JOIN的行可能不存在,请使用ColA IS NULL