Sql 为什么在这些示例中使用GROUPBY和HAVING子句中的许多列
鉴于该模式,我试图理解并解决以下3个sql查询,因为我感到困惑: 1-提交一份表格,列出有争议的国家的名称≥ 50%的城市化 利率、城市化率和人均GDP。注意 城市化率是居住在城市中的人口百分比。不要 统计人口值为空的城市Sql 为什么在这些示例中使用GROUPBY和HAVING子句中的许多列,sql,postgresql,Sql,Postgresql,鉴于该模式,我试图理解并解决以下3个sql查询,因为我感到困惑: 1-提交一份表格,列出有争议的国家的名称≥ 50%的城市化 利率、城市化率和人均GDP。注意 城市化率是居住在城市中的人口百分比。不要 统计人口值为空的城市 SELECT country.name, round(sum(city.population)/country.population, 3) AS urban, round(gdp/country.population, 3) AS gdppc FROM city INN
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;
在上面的查询中,为什么我需要将国家.人口
和经济.gdp
包含在分组中?如果我尝试仅在组中使用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;
为什么我需要上面的部分?
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 $$
(一)
您在选择中使用了country.population and economy.gdp,在聚合函数(COUNT()、AVG()和SUM()之外)中使用了GROUP BY。您选择的所有内容都必须位于GROUP BY或聚合函数内部
(二)
因为你被要求向所有拥有5000万以上人口的国家/地区的组织展示。使用have,您可以检查该组织是否拥有适当数量的国家
(三)
组织。“名称”=“Tivoli”
应该是:
组织机构名称1)
您在选择中使用了country.population and economy.gdp,在聚合函数(COUNT()、AVG()和SUM()之外)中使用了GROUP BY。您选择的所有内容都必须位于GROUP BY或聚合函数内部
(二)
因为你被要求向所有拥有5000万以上人口的国家/地区的组织展示。使用have,您可以检查该组织是否拥有适当数量的国家
(三)
组织。“名称”=“Tivoli”
应该是:
组织名称首先,你应该把一个问题限制在一个,而不是三个。但以下是所有3项的一些要点: 在上面的查询中,为什么我需要将
国家.人口
和经济.gdp
包含在分组中?如果我试着在组中只使用country.name
,我会得到一个错误,说我应该包括其他人
这是一项要求。只有当已知其他两个字段在功能上依赖于国家/地区.name
时,仅按国家/地区.name
分组才有效(在Postgres 9.1+中)。但可能country.name
不是country
表的主键,因此理论上,该表中可能有两条记录具有相同的名称,但人口不同
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;
规则是:
当存在“分组依据”
时,选择“
列表表达式引用未分组的列是无效的,聚合函数中除外,或者如果未分组的列在功能上依赖于分组的列,因为对于未分组的列,可能会返回多个值如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖关系。
这是从9.1版开始实施的
为什么我需要上面的部分
因为只有在分组后才能执行聚合上的条件(count,在本例中为
),因此不能在where
子句中表示。在这种情况下,having
条款确保该组织不仅存在于一些欧盟大成员国,而且存在于所有欧盟大成员国
我尝试了下面的脚本,但它不起作用,有什么建议吗
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 $$
如果没有正确的数据库模式,就不可能为您提供正确的SQ,但是从ERD图来看,组织
表似乎没有国家
字段。相反,ismember
表将组织与国家连接起来。您只需插入一个组织
,但要插入几个ismember
记录(每个涉及的成员国一个)
最好在
insert
语句中命名字段,这样就可以清楚地知道哪个值对应哪个字段。首先,您应该将问题限制为一个,而不是三个。但以下是所有3项的一些要点:
在上面的查询中,为什么我需要将国家.人口
和经济.gdp
包含在分组中?如果我试着在组中只使用country.name
,我会得到一个错误,说我应该包括其他人
这是一项要求。只有当已知其他两个字段在功能上依赖于国家/地区.name
时,仅按国家/地区.name
分组才有效(在Postgres 9.1+中)。但可能country.name
不是country
表的主键,因此理论上,该表中可能有两条记录具有相同的名称,但人口不同
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;
规则是:
当存在“分组依据”
时,选择“
列表表达式引用未分组的列是无效的,聚合函数中除外,或者如果未分组的列在功能上依赖于分组的列,因为对于未分组的列,可能会返回多个值如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖关系。
这是从9.1版开始实施的
为什么我需要上面的部分<