为什么我的SQL SUM包括NULL值时不会返回NULL?

3

我使用CTE来计算日志中时间段,如此代码片段所示:

http://www.sqlfiddle.com/#!3/b99448/6

请注意,其中一行具有NULL值,因为那是最近的日志条目,无法进行任何计算。
然而,如果我对这些结果进行SUM,那么NULL将被视为零:

http://www.sqlfiddle.com/#!3/b99448/4

我该如何让它停止忽略 NULL 值? 由于正在添加一个 NULL 值,所以我期望总和为 NULL

能否请下投票者解释一下我该如何改进这个问题? - Matthew
1
这就是sum()(或任何聚合函数)的定义方式:它们会忽略NULL值。在SQL标准中,1、2、null、3的总和按照定义为1+2+3=6。 - user330315
2
从手册中(https://msdn.microsoft.com/en-us/library/ms187810%28v=sql.105%29.aspx):“*SUM仅适用于数字列。**忽略空值***”。 - user330315
1个回答

5
聚合函数会忽略NULL值,它们不被视为0——这一区别对于AVG()MIN()MAX()更为重要。因此,只有当所有值都是NULL时,SUM()才返回NULL
如果你想得到NULL,可以使用以下简单表达式:
select (case when count(*) = count(a.DateTimeChangedUtc) and
                  count(*) = count(b.DateTimeChangedUTC)
             then SUM(DATEDIFF(SECOND, a.DateTimeChangedUtc, b.DateTimeChangedUTC)) 
        end) AS TimeSpentSeconds

如果任意一个参数为NULL,则此函数返回NULL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接