2017-09-06 85 views
1

鉴于架构here我试图理解和解决以下3 SQL查询,我很困惑使用GROUP BY的列和HAVING子句城市化率≥50%的国家的名称,城市化率,人均国内生产总值。请注意,城市化率是城市人口的百分比。不要 计算具有NULL值的城市人口。为什么在这些例子中

SELECT country.name, round(sum(city.population)/country.population, 3) AS urban, round(gdp/country.population, 3) AS gdppc 
FROM city 
INNER JOIN country ON code = country 
INNER JOIN economy ON code = economy.country 
WHERE city.population IS NOT NULL 
GROUP BY country.name, country.population, economy.gdp 
HAVING round(sum(city.population)/country.population, 3) >= 0.5 
ORDER BY urban DESC; 

在上面的查询,为什么我需要包括在GROUP BYcountry.populationeconomy.gdp?如果我在GROUP BY中尝试使用country.name,我收到一个错误,说我应该包含其他人。

2-显示那些拥有超过5000万人的所有欧洲国家的组织?

SELECT name 
FROM organization 
INNER JOIN (SELECT organization 
      FROM country 
      INNER JOIN encompasses 
      ON code = encompasses.country 
      INNER JOIN ismember 
      ON code = ismember.country 
      WHERE population > 50000000 AND continent = 'Europe' 
      GROUP BY organization 
      HAVING count(ismember.country) = (SELECT count(*) 
               FROM country 
               INNER JOIN encompasses 
               ON code = country 
               WHERE population > 50000000 AND continent = 'Europe')) 
      AS innerQuery 
      ON abbreviation = innerQuery.organization; 

为什么我需要上面的HAVING部分?

3-插入一个名为“Tivoli”的新组织和一个触发器,说明德国是否加入“Tivoli”,英国和法国也是这样。将德国插入“Tivoli”组织。确认正确的行为。

我试过下面的脚本,但它不起作用,有什么建议吗?

do $$ 
begin 
IF(NOT EXISTS (SELECT 1 FROM organization WHERE organization."name" = 'Tivoli' AND organization.country = 'D')) 
BEGIN 
    INSERT INTO organization VALUES ('Tivoli','Tivoli organization',NULL,'F',NULL,NULL); 
     INSERT INTO organization VALUES ('Tivoli','Tivoli organization',NULL,'GB',NULL,NULL); 

END; 
end $$ 

回答

0

1)

您使用country.population和economy.gdp的选择,外部的聚合函数(COUNT(),AVG()和SUM()),和你有一个GROUP BY 。您选择的所有内容必须位于GROUP BY中或聚合函数内部。

2)

因为你被要求证明都+为50Mil人的国家组织。通过HAVING,您可以检查该组织是否拥有适量的国家/地区。

3)

组织“名” =“蒂沃利” 它应该是: organization.name

0

首先,你应该限制一个问题,一个只,而不是3。但这里有一些指针全部3:

在上面的查询,为什么我需要包括在GROUP BYcountry.populationeconomy.gdp?如果我在GROUP BY中尝试使用country.name,我收到一个错误,说我应该包含其他人。

这是一个要求。只有在country.name的情况下,只有另外两个字段在功能上依赖于country.name才能工作(在Postgres 9.1+中)。但可能country.name不是country表的主键,因此理论上可能在该表中有两个具有相同名称但不同人口的记录。

规则是as follows

GROUP BY存在时,它是无效的SELECT列表中的表达式来指未分组列除了聚集函数内,或者如果未分组列在功能上依赖于分组列,因为否则会有多个可能的值返回未分组列。 如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖关系。

这是从版本9.1开始实施的。

为什么我需要上面的HAVING部分?

因为上的聚集体(count在这种情况下)的条件,只能分组之后进行,并且因此可以不where子句中表达。在这种情况下,having条款确保组织不仅存在于一些大欧盟成员国,而且全部大欧盟成员国。

我试过下面的脚本,但它不起作用,有什么建议吗?

没有适当的数据库模式,它是不可能为你提供了正确的SQ,但是从ERD图似乎organization表没有一个country场。相反,ismember表将组织与国家连接起来。你只插入一个organization,但有几个ismember记录(涉及每个成员国之一)

这也较好的名字在你的insert声明领域,所以很显然,其值对应于哪个领域。

相关问题