使用SQL Server,GROUP BY

oct*_*ler 1 sql sql-server

我正在研究数据库设计和架构,我遇到了一个我无法完成的问题.这里是:"列出加拿大的所有城市,然后将其人口表示为该国人口的百分比."

我的表是:

Country,CityCountryLanguage.

到目前为止,我发出的查询是:

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子句对名称进行分组吗?

Aar*_*and 6

你需要一种方法将城市与国家联系起来.目前您正在进行交叉加入,因此我预测您有以下加拿大城市的结果(但在错误的国家/地区):

  • 日本多伦多
  • 莱斯布里奇,中国
  • 南非温尼伯
  • 萨斯卡通,俄罗斯
  • 尼泊尔温哥华
  • 瑞典哈利法克斯
  • 法国蒙特利尔
  • 等等

这是一个使用适当的现代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语法(你的大部分问题是基于这种语法允许的错误!).