为什么数据库查询中的总和为NULL

时间:2018-10-08 08:16:32

标签: sql sql-server database

假设我有一个名为“ Expense”的表,它有一些按月的支出,其中可能包含一些“ NULL”,现在我想用下面的查询检查年度支出总额:-

enter image description here

Select Sum(January) + Sum (February) ..... (I skipped the rest 10 months)
from Expense 

结果为“ NULL”

如何避免这种情况?我认为有一种更方便的方法来检查年度金额

7 个答案:

答案 0 :(得分:4)

所有涉及NULL的算术或逻辑运算都将产生NULL。例如:

SELECT 1 + NULL -- NULL

必须先将NULL转换为零,然后才能+

SELECT
    COALESCE(SUM(January), 0) +
    COALESCE(SUM(February) , 0) +
    ...

还可以先添加列,然后计算总和:

SELECT SUM(
    COALESCE(January, 0) +
    COALESCE(February, 0) +
)

建议(i)SUM跳过NULL值(ii)如果所有值均为NULL,则返回NULL而不是0:

SELECT SUM(a) FROM (VALUES
    (1),
    (2),
    (NULL)
) AS v(a) -- returns 3 instead of NULL

如果遇到的所有 值为NULL,它将返回NULL:

SELECT SUM(a) FROM (VALUES
    (CAST(NULL AS INT)),
    (NULL),
    (NULL)
) AS v(a) -- returns NULL instead of 0

答案 1 :(得分:2)

使用合并函数将null转换为0,然后使用sum

Select Sum(coalesce(January,0)) + Sum (coalesce(February,0)) ..... (I skipped the rest 10 months)
from Expense

答案 2 :(得分:1)

只需使用coalesce [,第二个参数为0 ]替换所有月份列的空值,否则无法通过汇总数值获得真实结果:

select sum(coalesce(January,0)+coalesce(February,0) ... )
  from Expense

答案 3 :(得分:0)

由于null +值始终为null,并且在您的示例中某些月份的总和为null,因此可以通过添加ISNULL来避免这种情况

Select isnull(Sum(January),0) + 
    isnull(Sum(February),0) 
--..... (I skipped the rest 10 months)
from Expense 

或者,您可以使用以下方式:

Select Sum(
    isnull(January,0) + 
    isnull(February,0) 
    )
--..... (I skipped the rest 10 months)
from Expense 

答案 4 :(得分:0)

您可以使用ISNULL(SUM(January),0)

答案 5 :(得分:0)

因为您有NULL个值,所以可以使用CaseCoalesceIIF

Select SUM(IIF(Col IS NULL, 0, Col))

Select SUM(CASE WHEN Col IS NULL THEN 0 ELSE Col END)

Select COALESCE(Sum(Col), 0)

答案 6 :(得分:0)

如果给定列中至少有一个空值,则任何算术函数都将返回空值。这就是为什么您应该使用合并或isNull(MSSQL),NVL(Oracle)之类的功能的原因。