Afficher zéro en utilisant count (*) si aucun résultat n'est returnné pour un cas particulier

J'ai une requête comme celle-ci qui renvoie le nombre de lignes pour chaque cas dans la ville.

select case edition_id when 6 then 'DELHI' when 50 then 'AHMEDABAD' when 4 then 'HYDERABAD' when 25 then 'KOLKATA' when 51 then 'BANGALORE' when 5 then 'MUMBAI' when 24 then 'CHENNAI' end as CITY, count(*) as Total from #tmptab1 group by edition_id drop table #tmptab1 

Le résultat se révèle être comme

 CITY Total MUMBAI 1 DELHI 28 CHENNAI 1 KOLKATA 35 AHMEDABAD 3 

Donc, s'il n'y a pas de lignes returnnées par une ville, cette ville est omise dans le résultat final

Je veux un résultat comme

 CITY Total MUMBAI 1 DELHI 28 CHENNAI 1 KOLKATA 35 AHMEDABAD 3 BANGALORE 0 -- if no result from bangalore display zero. 

Comment faire ça?

j'ai essayé

 case count(*)>0 then count(*) else 0 end as Total 

mais ça ne marche pas

J'insertais les villes dans une table temporaire, puis ferais un LEFT JOIN avec la requête de regroupement comme suit:

 CREATE TABLE #cities (edition_id INT, city VARCHAR(16)) INSERT INTO #cities VALUES(6, 'DELHI') INSERT INTO #cities VALUES(50, 'AHMEDABAD') INSERT INTO #cities VALUES(4, 'HYDERABAD') INSERT INTO #cities VALUES(25, 'KOLKATA') INSERT INTO #cities VALUES(51, 'BANGALORE') INSERT INTO #cities VALUES(5, 'MUMBAI') INSERT INTO #cities VALUES(24, 'CHENNAI') select c.city 'City', ISNULL(t.Total, 0) 'Total' from #cities c LEFT JOIN ( SELECT edition_id, count(*) as Total #tmptab1 GROUP BY edition_id ) AS t ON c.edition_id = t.edition_id drop table #tmptab1 drop table #cities 

BTW, il serait logique d'avoir #cities comme une table normale de sorte que vous n'avez pas besoin de le créer à chaque fois que la requête s'exécute.

Le problème est que vous groupez par edition_id. S'il n'y a pas d'ID d'édition dans votre résultat, il ne peut pas le countr.

Ce que vous pouvez faire à la place est de sélectionner toutes les villes avec leur identifiant d'édition, de les joindre aux counts puis de faire un isnull:

 WITH CITIES AS ( SELECT 6 AS edition_id, 'DELHI' As CityName UNION SELECT 50, 'AHMEDABAD' UNION .... ) SELECT c.cityname, isnull(counts.total,0) as total FROM CITIES LEFT JOIN (SELECT edition_id, count(*) as Total #tmptab1 group by edition_id) counts ON counts.edition_id = CITIES.edition_id