sql - 为什么在这些示例中的 GROUP BY 和 HAVING 子句中使用许多列

标签 sql postgresql

给定架构 here我很困惑,试图理解并解决以下 3 个 sql 查询:

1- 出示一张表格,列出城市化率≥ 50% 的国家/地区名称 率、城市化率和人均 GDP。注意 城市化率是居住在城市的人口百分比。不要 计算人口值为 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 BY 中包含 country.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 $$

最佳答案

1)

您在聚合函数(COUNT()、AVG() 和 SUM())之外的选择中使用了 country.population 和 economy.gdp,并且您有一个 GROUP BY。您选择的所有内容都必须在 GROUP BY 中或聚合函数内。

2)

因为您被要求展示拥有超过 5000 万人口的所有国家/地区的组织。使用 HAVING,您可以检查该组织是否拥有适当数量的国家/地区。

3)

organization."name"= 'Tivoli' 它应该是: 组织名称

关于sql - 为什么在这些示例中的 GROUP BY 和 HAVING 子句中使用许多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46085548/

相关文章:

postgresql - 在 docker 环境中重启 postgres

mysql - SQL 模式创建(头脑 Storm 有帮助吗?)

regex - Postgresql 替换所有出现的字符串+

sql - 如何在公共(public)表中使用递归查询获取第二个父级

SELECT 和 UPDATE 之间的 SQL 数据库锁定差异

mysql - 当它引用的字段自动递增时,我如何有效地模仿外键约束?

SQL 更新标量函数

mysql - SQL 中值未声明变量

mysql - 如何小计多列

postgresql - 如何返回表的行类型加上函数的附加列?