带有COUNT的ISNULL(*)

时间:2017-04-29 15:13:35

标签: sql sql-server tsql

╔═══════╦═══════╗
║ agent ║ prime ║
╠═══════╬═══════╣
║ Said  ║ 100   ║
║ Farid ║ 200   ║
║ Walid ║ 150   ║
║ Said  ║ 300   ║
║ Said  ║ 250   ║
║ Said  ║ 400   ║
║ Farid ║ 300   ║
║ Farid ║ 250   ║
║ Walid ║ 140   ║
╚═══════╩═══════╝

查询

select  agent, ISNULL(count(*),0) as NB from [agents]
where prime >= 200
group by agent

输出:

╔═══════╦═══════╗
║ agent ║ prime ║
╠═══════╬═══════╣
║ Farid ║     3 ║
║ Said  ║     3 ║
╚═══════╩═══════╝

我想用0替换空值,因为你可以看到代理'walid'没有素数> = 200.我想要实现的结果:

agent   prime
Farid   3
Said    3
Walid   0

我知道它可以使用UNION实现,但我想知道为什么这个ISNULL在这种情况下不起作用,如果可能的话。

3 个答案:

答案 0 :(得分:4)

您的where子句完全从结果集中过滤掉Walid。请尝试这种方法:

select agent, sum(case when prime >= 200 then 1 else 0 end) as NB
from [agents]
group by agent

答案 1 :(得分:1)

问题是where子句会过滤掉所有内容。您可以使用条件聚合完成您想要的任务:

select agent, sum(case when prime >= 200 then 1 else 0 end) as nb
from agents
group by agent;

作为提示:count(*)不会返回NULL。它返回0,因此无需使用COALESCE()(或类似逻辑)。

答案 2 :(得分:0)

请使用NVL代替ISNULL。它应该给你想象的结果。