我尝试根据 status
列将一个 datefield
列拆分为三个目标列:
我的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 均为 Null。
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
关于SQL UNION ALL 查询返回日期字段中的所有 Null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58087650/