2012-12-20 1 views
5

都市の各ケースの行数を返すこのようなクエリがあります。行が街からそこに返されていない場合特定のケースに対して結果が返されない場合は、count(*)を使用してゼロを表示します。

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 

結果が

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

ようになり出てくるので、その都市が最終結果に

を省略している私は

となりたいです
CITY Total 
MUMBAI 1 
DELHI 28 
CHENNAI 1 
KOLKATA 35 
AHMEDABAD 3 
BANGALORE 0 -- if no result from bangalore display zero. 

これを行う方法は?

私は次のようにLEFTは、グループ化のクエリで登録しようか、一時的なテーブルに都市を挿入する私は

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

を試してみましたが、それは

答えて

5

を動作しません:

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 

ところで、通常のテーブルとして#citiesを持つのが理にかなっているので、クエリが実行されるたびに作成する必要はありません。

+2

都市に通常のテーブルをすることについて同意するものとします。これは、今後新しい都市を追加するときにコードを変更する必要がないことを意味します。テーブルに新しいレコードを追加するだけです。 – Greg

+1

単語は私がどのように感謝しているか記述することはできません。 –

2

問題は、あなたがedition_idでグループ化していることです。結果にedition_idが含まれていない場合は、カウントできません。あなたの代わりに何ができるか

がその版のIDを持つすべての都市を選択している、カウントにそれに参加し、その後、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 
関連する問題