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

标签 sql postgresql date null union-all

我尝试根据 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/

相关文章:

python - 通过不区分大小写的列表进行 SQLAlchemy 查询

javascript - 使用 Knex.js : bind message supplies X parameters, 时出现批量插入错误,但准备好的语句 ""需要 Y

SQL Server 2014 以秒为单位插入/更新 smalldatetime 值

javascript - 如何在 javascript 中获取当前日期减去 20 秒?

Java/JavaScript 日期 : Is this true?

mysql - 如何暂时禁用 MySQL 中的外键约束?

java - 如何转义 SQL 查询中使用的特殊字符?

php - 取决于项目查询的意外项目评论

SQL查找具有包含字符串的属性的表的计数

postgresql - 跨平台整理和 ctype