使用计数(列)SQL Server时返回NULL而不是0

使用计数(列)SQL Server时返回NULL而不是0,sql,sql-server,null,case,Sql,Sql Server,Null,Case,我有一个查询,哪个运行良好,它做两种工作,COUNT和SUM 差不多 select id, Count (contracts) as countcontracts, count(something1), count(something1), count(something1), sum(cost) as sumCost from table group by id 我的问题是:如果给定ID没有约定,它将为COUNT返回0,为

我有一个查询,哪个运行良好,它做两种工作,
COUNT
SUM

差不多

select 
    id,
    Count (contracts) as countcontracts,
    count(something1),
    count(something1),
    count(something1),
    sum(cost) as sumCost
from 
    table
group by 
    id
我的问题是:如果给定ID没有约定,它将为
COUNT
返回0,为
SUM
返回
Null
。我希望看到null而不是0

我考虑的是当
Count(contracts)=0然后null else Count(contracts)end
时的情况,但我不想这样做,因为我在查询中有12个以上的计数位置,并且它预占用了大量记录,所以我认为这可能会降低查询性能


是否有其他方法将0替换为
NULL

以下是三种方法:

1. (case when count(contracts) > 0 then count(contracts) end) as countcontracts
2. sum(case when contracts is not null then 1 end) as countcontracts
3. nullif(count(contracts), 0)

所有这三项都需要编写更复杂的表达式。然而,这并不是那么困难。只需将该行复制多次,并更改每个行上变量的名称。或者,获取当前查询,将其放入电子表格并使用电子表格函数进行转换。然后向下复制函数。(对于重复的代码行,电子表格是非常好的代码生成器。)

以下是三种方法:

1. (case when count(contracts) > 0 then count(contracts) end) as countcontracts
2. sum(case when contracts is not null then 1 end) as countcontracts
3. nullif(count(contracts), 0)
所有这三项都需要编写更复杂的表达式。然而,这并不是那么困难。只需将该行复制多次,并更改每个行上变量的名称。或者,获取当前查询,将其放入电子表格并使用电子表格函数进行转换。然后向下复制函数。(对于重复的代码行,电子表格确实是很好的代码生成器。)

尝试以下方法:

`select NULLIF ( Count(something) , 0)
试试这个:

`select NULLIF ( Count(something) , 0)

做一个CTE,在主/外部级别替换。不能做CTE它已经是CTE的一部分:)它也是插入的一部分如果比case when else end短:IIF(expression,truepart,falsepart)正如你所知,当你有
when(contracts)=0然后null else(contracts)end
时,函数不会执行两次。结果被缓存并在两个位置使用。因此没有额外的开销。它只是看起来笨重而冗长。做一个CTE,在主/外部级别替换。不能做CTE它已经是CTE的一部分:)它也是插入的一部分,比case when-else-end短:IIF(表达式,truepart,false-part)正如你所知,当(契约)=0时,如果你有类似于
的东西,那么null-else(契约)end
,该函数不会执行两次。结果被缓存并在两个位置使用。因此没有额外的开销。它只是看起来笨重而冗长。我不确定这种情况是否是个好主意,因为它是查询的一部分,其中已经有超过14个CTE的几个case语句,还有一个更新:)老实说,不要认为添加14个额外的案例不会影响性能如果方法是最好的,但在您的示例中有一个错误,它应该是nullif(count(contracts),0)我不确定这个case是不是好主意,因为它是查询的一部分,其中已经有超过14个CTE的几个case语句和一个更新:)老实说,不要认为添加14个额外的case不会影响性能如果方法是最好的,但在您的示例中有一个错误,如果(计数(合同),0),则应为空