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;
我正在尝试将一个 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;