SQL UNION ALL 查询返回日期字段中的所有空值

SQL UNION ALL query returning all Null values in date field

我正在尝试将一个 datefield 列拆分为三个目标列,具体取决于 status 列:

我的table1如下:

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

所以我正在尝试将此数据转换为以下格式(当 id 进入某个阶段时跟踪时间戳)

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

关于为什么会发生这种情况的任何意见或方向?

您的列顺序有问题。你必须保持顺序不变......但话又说回来你根本不需要工会:

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

我相信你想要:

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;