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

时间:2015-09-17 18:00:19

标签: sql sql-server-2008

我使用CTE来计算日志中的时间跨度,如下所示:

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

请注意,其中一行的值为NULL,因为这是最新的日志条目,无法进行任何计算。

但是,如果我SUM这些结果,NULL被视为零:

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

如何让它停止忽略NULL值? 我希望总和为NULL,因为它正在添加NULL值。

1 个答案:

答案 0 :(得分:5)

聚合函数忽略NULL个值。它们不被视为0 - 区别对于AVG()MIN()MAX()更为重要。因此,SUM()仅在所有值均为NULL时返回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