2012-12-20 12 views
5

Ho una query come questa che restituisce il numero di righe per ogni caso in città.Visualizza zero utilizzando il conteggio (*) se nessun risultato è stato restituito per un caso particolare

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 

Il risultato viene fuori per essere come

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

Quindi, se non ci sono righe restituite da una città, quella città è omesso nel risultato finale

voglio risultare

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

Come fare questo?

ho cercato

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

ma non funziona

risposta

5

vorrei inserire le città in una tabella temporanea, poi fare un LEFT JOIN con la query di raggruppamento come segue:

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, avrebbe senso avere #cities come una tabella normale in modo che non sia necessario crearlo ogni volta che viene eseguita la query.

+2

d'accordo su come rendere le città un tavolo normale. Questo significa anche che non è necessario modificare il codice quando si desidera aggiungere una nuova città in futuro - basta aggiungere un nuovo record al tavolo – Greg

+1

le parole non possono descrivere quanto sono grato..grazie un sacco di vikdor –

2

Il problema è che si sta raggruppando per edition_id. Se non ci sono edition_id nel tuo risultato, allora non può contarlo.

Che cosa si può fare, invece è selezionare tutte le città con il loro edizione id, sinistra unirlo ai conti e poi fare 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 
Problemi correlati