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

Consulta

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

La salida:

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

Quiero reemplazar el valor nulo con 0 porque, como puede ver, el agente 'walid' no tiene primo> = 200. Los resultados que quiero lograr:

agent   prime
Farid   3
Said    3
Walid   0

Sé que se puede lograr con un UNION pero quiero saber por qué este ISNULL no es funcional en este caso y si es posible hacerlo.

0
user3832856 29 abr. 2017 a las 18:13

3 respuestas

La mejor respuesta

Su cláusula where filtra Walid de su conjunto de resultados por completo. Pruebe este enfoque en su lugar:

select agent, sum(case when prime >= 200 then 1 else 0 end) as NB
from [agents]
group by agent
4
Brandon 29 abr. 2017 a las 15:22

El problema es que la cláusula where filtra todo. Puede lograr lo que quiere usando la agregación condicional:

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

Como pista: count(*) no devuelve NULL. Devuelve 0, por lo que no es necesario usar COALESCE() (o una lógica similar).

1
Gordon Linoff 29 abr. 2017 a las 15:32

Utilice NVL en lugar de ISNULL. Supongo que debería darte el resultado deseado.

0
Biswabid 29 abr. 2017 a las 15:19