Объединить значения нескольких столбцов в одну строку - PullRequest
1 голос
/ 18 апреля 2019

У меня есть данные как ниже, где я хочу объединить строки, имеющие нулевые значения с ненулевыми значениями.

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

В основном для одного идентификатора может существовать несколько строк (разные COLA), но только одна строка с нулевым ColA.

ColC и ColD всегда будут равны нулю для строк, не имеющих значение ColA.

Я хочу объединить значения ColB, ColC и ColD для строки, имеющей ноль ColA, со всеми строками, не имеющими ноль ColA.

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Одним из способов является использование двух взаимосвязанных подзапросов:

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

EDIT


Если для определенного идентификатора только одна строка с ненулевым значением ColA

Полагаю, вы имеете в виду, что строки с 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
      )
0 голосов
/ 18 апреля 2019

Вы можете попробовать это:

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 может не существовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...