6

cityの各ケースの行数を返すこのようなクエリがあります。

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.

これを行う方法 ?

私は試した

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

しかし、それは機能しません

4

2 に答える 2

6

都市を一時テーブルに挿入してから、次のようにグループ化クエリを使用してLEFTJOINを実行します。

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ところで、クエリを実行するたびにテーブルを作成する必要がないように、通常のテーブルとして使用するのは理にかなっています。

于 2012-12-20T05:14:41.300 に答える
3

問題は、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
于 2012-12-20T05:17:51.073 に答える