SQL UNION ALL запрос, возвращающий все нулевые значения в поле даты - PullRequest
2 голосов
/ 24 сентября 2019

Я пытаюсь разделить один столбец datefield на три целевых столбца, в зависимости от столбца status:

Мой table1 выглядит следующим образом:

**id    status    DateField**
   1     A       1/5/2018
   2     B       1/6/2018
   3     C       1/7/2018

ИтакЯ пытаюсь преобразовать эти данные в следующий формат (отслеживание меток времени, когда идентификатор вошел в определенную стадию)

id    Timestamp_A  Timestamp_B    Timestamp_C
1      1/5/2018     Null           Null
2.     Null         1/6/2018       Null
3.     Null         Null           1/7/2018

Я использовал следующий запрос для получения желаемых результатов

SELECT id, status,
 CAST( DATEFIELD AS DATE) AS "Timestamp_A",
 CAST(NULL AS DATE) AS "Timestamp_B",
 CAST(NULL AS DATE) AS "Timestamp_C"
FROM table 1
WHERE status='A'

UNION ALL

SELECT id, status,
 CAST( DATEFIELD AS DATE) AS "Timestamp_B",
 CAST(NULL AS DATE) AS "Timestamp_A",
 CAST(NULL AS DATE) AS "Timestamp_C"
FROM table 1
WHERE status='B'

UNION ALL

SELECT id, status,
 CAST( DATEFIELD AS DATE) AS "Timestamp_C",
 CAST(NULL AS DATE) AS "Timestamp_A",
 CAST(NULL AS DATE) AS "Timestamp_B"
FROM table 1
WHERE status='C'

Хотя каждый запрос работает индивидуально, при использовании UNION ALL только первый запрос, по-видимому, работает в отношении полей даты, т. Е. Только Timestamp_A заполняется правильными значениями, в то время как метки времени B и C являются пустыми.

id    Timestamp_A  Timestamp_B    Timestamp_C
1      1/5/2018     Null           Null
2.       Null       Null           Null
3.       Null       Null           Null

Любой вклад или направление, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Я верю, что вы хотите:

SELECT id, status,
       (CASE WHEN status = 'A' THEN datefield END) AS Timestamp_A,
       (CASE WHEN status = 'B' THEN datefield END) AS Timestamp_B,
       (CASE WHEN status = 'C' THEN datefield END) AS Timestamp_C
FROM t;
1 голос
/ 24 сентября 2019

Порядок ваших столбцов является проблемой.Вы должны соблюдать порядок ... Но опять же, вам не нужны профсоюзы вообще:

SELECT id
    , CASE WHEN DateField = '1/5/2018' THEN DateField END AS TimeStampA
    , CASE WHEN DateField = '1/6/2018' THEN DateField END AS TimeStampB
    , CASE WHEN DateField = '1/7/2018' THEN DateField END AS TimeStampC
FROM t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...