2012-10-30 14 views
4

包含下列值表:为什么包含空值的多个列的Sql和返回不正确的结果?

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

以下查询:

SELECT 
    SUM([Column1] + [Column2]) 
FROM [myTable] 

返回9的值时,它应该返回21。为什么?它如何达到价值?

我知道SUM可以通过添加ISNULL像这样进行修正:

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

,但我想知道的逻辑值9

+1

'null'和一个数字的总和是多少?请注意'9'来自哪里:唯一具有非空'Column1'和_' Column2'的行。 –

+0

@MattBall是的!我现在看到,计算将跳过具有空列1或列2的任何行。如果您添加该答案作为答案,我会将其标记为正确 –

回答

4

什么是null之和的数字,正是之前增值+ NULL?请注意0​​来自哪里:唯一有非空的行Column1Column2

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

(在OP的请求copypasta'd)

+0

我将此标记为答案,因为它是第一个解释9来自哪里的逻辑的答案。 –

6

使用COALESCE背后转化为0。 (就是这样,如果你要空值为零

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

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

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

它是一个问题与一个空值。

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

确保它至少始终为0。

谢谢

3

因为它是总结

尝试总和(列1)+ SUM(列2)

+0

这是其他人提供的ISNULL/COALESCE建议的不错选择。但是,请注意,如果一列完全没有值(只有NULL),则该值将为NULL。尽管如此,我仍然更喜欢ISNULLing SUM的结果而不是它的参数。 –

+0

最简单最好的! – DaveBoltman

1
  1. 数+ NULL = NULL
  2. SUM(表达)函数是通过各行分别与计算表达操作返回一个NOT_NULL值为。然后将所有结果汇总并返回。

这就是为什么你的结果是9 ISNULL(表达式,replacement_value)可以帮助你在这种情况下。:)

1

另一种解释(以防万一它的人工作得更好):

NULL的影响+但不影响SUM():其中一个NULL是+ -ed,它的计算结果为NULL,它总结,它被忽略。 (但SUM()可以返回NULL,当没有一个参数是一个)产生一个非NULL结果为+

因此,有你的数据样本(最后一个)中只有一行,结果是9,这也是SUM()返回的结果。

相关问题