我有一个名为Apartments的表,它有三列:apartment_type,person,date。它包括由某个人和日期选择的公寓类型。我需要算一下有多少人选择了每种公寓类型。一些公寓类型有0人口。
这是我的问题:
SELECT apartment_type, COUNT(*) AS TOTAL
FROM Apartments
GROUP BY apartment_type
效果很好,但它不包含值为0的公寓类型。请帮我纠正此查询。
答案 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
使用左连接将为您提供连接左侧的所有内容(所有类型)以及匹配右侧的所有内容。