假设我有一个名为“ Expense”的表,它有一些按月的支出,其中可能包含一些“ NULL”,现在我想用下面的查询检查年度支出总额:-
Select Sum(January) + Sum (February) ..... (I skipped the rest 10 months)
from Expense
结果为“ NULL”
如何避免这种情况?我认为有一种更方便的方法来检查年度金额
答案 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
个值,所以可以使用Case
,Coalesce
或IIF
:
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)之类的功能的原因。