╔═══════╦═══════╗
║ 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在这种情况下不起作用,如果可能的话。
答案 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
。它应该给你想象的结果。