如果特定情况下没有返回结果,则使用count(*)显示零

6

我有一个类似这样的查询,它返回每个城市案例的行数。

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 

但它不起作用。

2个回答

6
我会将这些城市插入到一个临时表中,然后使用以下左连接分组查询:
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
无法用言语形容我有多感激,非常感谢 Vikdor 大师。 - Mudassir Hasan

3
问题在于您正在按版次 ID 进行分组。如果结果中没有版次 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接