OLAP表转事务表:日期转换查询返回NULL问题求助
问题排查与解决:OLAP表转事务表时Date列NULL问题
原表结构
| ID | Period Month | 01 | 02 | Employee Code |
|---|---|---|---|---|
| 1 | 202401 | K | L | 005678 |
| 2 | 202401 | S1 | M | 005679 |
预期结果
| Employee Code | Period Month | Date | Value |
|---|---|---|---|
| 005678 | 202401 | 2024-01-01 | K |
| 005678 | 202401 | 2024-01-02 | L |
| 005679 | 202401 | 2024-01-01 | S1 |
| 005679 | 202401 | 2024-01-02 | M |
原SQL问题分析
原查询中Date列全为NULL的核心原因是日期拼接格式错误:
CAST([Period Month] AS CHAR(4))将6位的yyyymm值(如202401)截断为前4位(2024),拼接-01后得到2024-01,这是年月格式而非完整的年月日格式,TRY_CAST无法正确转换为DATE类型,最终返回NULL。- 冗余的CASE语句不仅增加复杂度,还掩盖了格式错误的问题。
修正后的SQL
SELECT [Employee Code], [Period Month], TRY_CAST(LEFT([Period Month], 4) + '-' + RIGHT([Period Month], 2) + '-' + [DayCol] AS DATE) AS [Date], [Value] FROM (SELECT [Employee Code], [Period Month], [01], [02] FROM CTE1) AS SourceTable UNPIVOT ([Value] FOR [DayCol] IN ([01], [02])) AS UnpivotedTable WHERE TRY_CAST(LEFT([Period Month], 4) + '-' + RIGHT([Period Month], 2) + '-' + [DayCol] AS DATE) IS NOT NULL ORDER BY [Employee Code], [Period Month], [Date];
关键优化点
- 正确拼接日期:用
LEFT([Period Month],4)提取年份,RIGHT([Period Month],2)提取月份,与日部分([DayCol])拼接成yyyy-mm-dd格式的字符串,确保TRY_CAST能正确转换为DATE类型。 - 避免列名冲突:将UNPIVOT的列名从
[Date]改为[DayCol],提升代码可读性。 - 过滤无效日期:通过
WHERE子句排除转换失败的NULL值,确保结果仅包含有效日期。
内容的提问来源于stack exchange,提问作者Fachry Dzaky
相关产品推荐
相关产品推荐

