2012-12-20 22 views
5

Şehirde her durum için satır sayısı döndüren böyle bir sorgu var. hiçbir satır bir şehirde dönen varsaBelirli bir durum için hiçbir sonuç döndürmezse sayımı (*) kullanarak sıfırlama

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 

sonuç o şehir

Ben

olarak neden istiyor nihai sonuçta atlanırsa, Yani

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

gibi olmak çıkıyor

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

Bu nasıl yapılır?

Ben

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

denedik ama ben geçici bir tabloya şehirler eklemek istiyorum

cevap

5

çalışmaz, o zaman SOL gruplama sorgu ile JOIN do şöyle:

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, normal bir tablo olarak #cities olması mantıklı olacaktır, böylece sorgu her çalıştığında oluşturmanız gerekmez.

+2

şehirler normal bir tablo yapma konusunda hemfikir. Bu aynı zamanda gelecekte yeni bir şehir eklemek istediğinizde kodunuzu değiştirmeniz gerekmediği anlamına gelir - sadece tabloya yeni bir kayıt ekleyin – Greg

+1

kelimeler ne kadar müteşekkir olduğumu anlatamaz ... çok fazla usta vikdor –

2

Sorun şu ki, edition_id tarafından gruplanıyorsunuz. Sonucunuzda edition_id yoksa, o zaman bunu sayamaz. Bunun yerine ne olabilir onların baskısı kimliği ile tüm şehirleri dışarı seçmektir

, sayıları için katılın bıraktı ve daha sonra ISNULL yapın:

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 
İlgili konular