2012-12-20 4 views
5

J'ai une requête comme celle-ci qui retourne le nombre de lignes pour chaque cas dans la ville.Afficher zéro à l'aide de count (*) si aucun résultat n'est renvoyé pour un cas particulier

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 sort être comme

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

Donc, s'il n'y a pas de lignes renvoyées d'une ville, cette ville est omis dans résultat final

Je veux le résultat en

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

Comment faire?

J'ai essayé

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

mais il ne fonctionne pas

Répondre

5

j'insérer les villes dans une table temporaire, puis de faire 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.

+2

d'accord de faire les villes d'une table normale. Cela signifie également que vous n'avez pas besoin de changer votre code lorsque vous voulez ajouter une nouvelle ville à l'avenir - il suffit d'ajouter un nouvel enregistrement à la table – Greg

+1

mots ne peuvent décrire comment je suis reconnaissant .. merci beaucoup maître vikdor –

2

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

Qu'est-ce que vous pouvez faire à la place est de sélectionner toutes les villes avec leur id édition, à gauche joindre au compte et faire une 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 
Questions connexes