为什么包含空值的多列的Sql Sum返回不正确的结果?

时间:2012-10-30 03:29:42

标签: sql sql-server tsql

包含以下值的表:

Column1  Column2
1        NULL
NULL     4
2        NULL
NULL     5
3        6

以下查询:

SELECT 
    SUM([Column1] + [Column2] ) 
FROM [myTable]
当应该返回9时,

返回值21。为什么?它是如何达到价值的?

我知道可以通过添加ISNULL来纠正SUM:

SELECT 
    SUM(ISNULL([Column1], 0) + ISNULL([Column2], 0)) 
FROM [myTable]

但我想知道值9

背后的逻辑

7 个答案:

答案 0 :(得分:6)

使用COALESCE null 转换为0。 (如果您想将空值设为零,那就是它。

SELECT SUM(COALESCE(column1,0) + COALESCE(column2,0))
FROM table1

答案 1 :(得分:4)

null和数字之和究竟是多少?请注意9来自的位置:唯一具有非空Column1Column2的行。

One viable solution当然已经发布了。但是,跳到修复中的乐趣在哪里?

(根据OP的要求复制)

答案 2 :(得分:3)

因为它在求和之前加上值+ NULL

尝试sum(column1)+ sum(column2)

答案 3 :(得分:1)

使用ISNULL函数获得所需的行为:

SELECT SUM(ISNULL(Column1, 0) + ISNULL(Column2, 0)) FROM [myTable]

答案 4 :(得分:1)

Null值存在问题。

SELECT SUM(IsNull(Column1, 0) + IsNull(Column2, 0) ) FROM [myTable]

确保它始终为0。

谢谢

答案 5 :(得分:1)

  1. number + NULL = NULL
  2. SUM(表达式)函数通过分别计算每一行的表达式来操作,并返回一个NOT_NULL值。然后将所有结果汇总并返回。
  3. 这就是为什么你的结果是9的原因。 ISNULL(表达式,replacement_value)可以在这种情况下帮助您。 :)

答案 6 :(得分:1)

另一种解释(以防万一对某人有效):

NULL影响+,但不影响SUM():其中NULL为+ - ed,它的计算结果为NULL,它是SUMmed,它被忽略。 (但SUM() 可以在没有单个参数是时返回NULL。)

因此,数据样本中只有一行(最后一行)为+生成非NULL结果,结果为9,这是{{1}也会返回。