我正在研究数据库设计和架构,我遇到了一个我无法完成的问题.这里是:"列出加拿大的所有城市,然后将其人口表示为该国人口的百分比."
我的表是:
Country,City和CountryLanguage.
到目前为止,我发出的查询是:
SELECT DISTINCT City.Name,
CAST(City.Population as float)/CAST(Country.Population as float)*100 as Percentage
FROM City,Country
Where City.CountryCode='CAN' and
Country.Population >0
Run Code Online (Sandbox Code Playgroud)
但是,我仍然得到多个名称和百分比超过100.我可以使用任何聚合函数来使用GROUP BY子句对名称进行分组吗?
你需要一种方法将城市与国家联系起来.目前您正在进行交叉加入,因此我预测您有以下加拿大城市的结果(但在错误的国家/地区):
这是一个使用适当的现代INNER JOIN语法的查询,通过CountryCode关联City和Country(我从您现有的查询中做出的假设).
SELECT City.Name, Percentage = CONVERT(DECIMAL(12,2), City.Population)
/ NULLIF(Country.Population,0) * 100.0
FROM dbo.City
INNER JOIN dbo.Country
ON City.CountryCode = Country.CountryCode
WHERE Country.CountryCode = 'CAN' AND Country.Population > 0;
Run Code Online (Sandbox Code Playgroud)
请注意,我NULLIF在分母中使用,以防SQL Server决定尝试在那里放置0,这可能发生并在WHERE子句消除这样的行之前进行处理(有关更多详细信息,请参阅此Connect项).
请阅读这篇文章,了解为什么你永远不应该使用FROM table1, table2语法(你的大部分问题是基于这种语法允许的错误!).
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |