查询单个表时如何包含零结果?

时间:2016-07-11 17:34:12

标签: sql

我有一个名为Apartments的表,它有三列:apartment_type,person,date。它包括由某个人和日期选择的公寓类型。我需要算一下有多少人选择了每种公寓类型。一些公寓类型有0人口。

这是我的问题:

SELECT apartment_type, COUNT(*) AS TOTAL
FROM  Apartments
GROUP BY apartment_type

效果很好,但它不包含值为0的公寓类型。请帮我纠正此查询。

3 个答案:

答案 0 :(得分:2)

如果某些appartment_type有0个人口 - 您的表将不包含该类型的任何记录 - 因此您必须从另一个表中添加一些连接,其中存在所有公寓类型。或者使用union创建所有0个填充的条目。

类似的东西:

SELECT apartment_type, COUNT(*) AS TOTAL
FROM  (SELECT * FROM Apartments UNION ALL SELECT apartment_type, 0 as person, 0 as date from SomeTableWithFullListOfTypes group by apartment_type) as tmp
GROUP BY apartment_type

答案 1 :(得分:1)

我普遍同意Nosyara的回答,但我不同意他使用union all的示例查询。我不确定它是否有效,而且它当然太复杂了。

如上所述,如果您没有包含所有可能公寓类型的表格,请创建一个。然后,您可以使用简单的left join

编写查询
select t.apartment_type, count(a.apartment_type) as total
  from apartment_types t
  left join apartments a
    on a.apartment_type = t.apartment_type
 group by t.apartment_type

请注意count(*)如何替换为count(a.apartment_type)。如果您没有特定公寓类型的公寓,则必须进行更改才能准确计算。

答案 2 :(得分:1)

SELECT apartment_type, COUNT(apartment.*) AS TOTAL
FROM  apartment_type 
left join apartment
on  apartment_type.aparentment_type = apartements.apartment_type
GROUP BY apartment_type

使用左连接将为您提供连接左侧的所有内容(所有类型)以及匹配右侧的所有内容。