如何修改SQL日列透视表查询,将NULL值替换为0.00?
解决SQL透视表多行转单行并替换NULL为0的问题
嘿,这个问题我之前做考勤统计的时候也遇到过!你的原SQL其实已经把日期列拆出来了,但因为没有做聚合分组,所以每个日期对应一行,非对应日期的列都是NULL。要得到单行、NULL转0的结果,只需要加两步:聚合函数合并行 + NULL值替换,具体修改如下:
修改后的SQL语句
SELECT USERID, ISNULL(MAX(CASE WHEN DATEPART(d, DATE) = 26 THEN sick END), 0.00) AS [26], ISNULL(MAX(CASE WHEN DATEPART(d, DATE) = 27 THEN sick END), 0.00) AS [27], ISNULL(MAX(CASE WHEN DATEPART(d, DATE) = 28 THEN sick END), 0.00) AS [28] -- 其他需要的日期可以按照同样的格式添加 FROM tbl_Chktime WHERE DATE BETWEEN '2017-12-26' AND '2017-12-28' AND USERID = '15831' GROUP BY USERID
关键修改点解释
MAX()聚合函数:
因为同一USERID下每个日期只会有一个非NULL的sick值,MAX()会把分散在不同行的非NULL值聚合到同一行,自动忽略其他NULL值。你也可以用SUM(),效果是一样的,只要每个日期对应唯一值即可。ISNULL(..., 0.00)替换NULL:
如果某个日期没有对应的记录,聚合后还是会返回NULL,用ISNULL可以直接把这些NULL替换成你需要的0.00。如果是其他数据库(比如MySQL用IFNULL,PostgreSQL用COALESCE),可以换成对应函数,但你的DATEPART是SQL Server语法,所以ISNULL完全适用。GROUP BY USERID:
聚合函数必须配合GROUP BY使用,这里按USERID分组,确保所有属于同一个用户的行被合并成一行。
执行这个修改后的语句,就能得到你想要的单行结果,所有NULL都被替换成0.00啦!
内容的提问来源于stack exchange,提问作者kittisak chumpu
相关产品推荐
相关产品推荐

