我们在学校学习SQL,我的教授在他的文档中有这个sql代码。
SELECT wp.city, (COUNT(*) / locations.area) AS population_density
FROM world_poulation AS wp
INNER JOIN location
ON wp.city = locations.city
WHERE locations.state = “Hessen”
GROUP BY wp.city, locations.area
对我来说一切都很清楚,只是使用/locations.area的聚合函数对我没有任何意义。有人可以帮忙吗?
先感谢您!
查看查询的分组内容,告诉您每个组的组成。在这种情况下,每个组都是一个城市,并包含wp.city
具有相同值的所有行(并且由于location
表也加入了该值,因此locations.area
仅包含在分组中,以便可以在结果)。
因此每个组都有多个行,而COUNT(*)
聚合将包含每个组的行数。 (COUNT(*) / locations.area)
的值将是该组中的行数除以该组的locations.area
值。
如果您有这样的数据:
world_population
name city
--------- ---------
John London
Peter London
Sarah London
Malcolm London
Ian Cardiff
Johanna Stockholm
Sven Stockholm
Egil Stockholm
locations
city state area
----------- -------------- ---------
London Hessen 2
Cardiff Somehere else 14
Stockholm Hessen 1
然后你会得到两组的结果(因为加的夫不在Hessen州)。一组有4人来自伦敦,其中面积为2,因此人口密度为2.另一组有来自斯德哥尔摩的三人,面积为1,因此人口密度为3。
旁注:查询中有一个拼写错误,因为它连接在表location
中,但在其他地方称为locations
。
尝试写它像:
SELECT wp.city,
locations.area,
COUNT(*) AS population,
(COUNT(*) / locations.area) AS population_density
FROM world_poulation AS wp
INNER JOIN location
ON wp.city = locations.city
WHERE locations.state = “Hessen”
GROUP BY wp.city, locations.area
关键是GROUP BY语句。您正在显示成对的城市和地区。 COUNT(*)是通过加入世界人口和位置而在您创建的表格中显示给定对的次数。该区域只是一个数字,因此您可以将该区域除以COUNT。