错误代码1111.无效使用组功能

use*_*108 16 mysql mysql-workbench mysql-error-1111

这样可行:

SELECT c.name AS country_name, c.population AS country_population, SUM(ci.population) AS city_population, ROUND(100*(SUM(ci.population)/c.population)) AS city_population_percent
FROM country AS c
JOIN city AS ci
ON c.code = ci.countrycode
WHERE c.continent = 'Europe'
GROUP BY c.name
Run Code Online (Sandbox Code Playgroud)

但是我只需要获取大于30的city_population_percent值,所以我试试这个:

SELECT c.name AS country_name, c.population AS country_population, SUM(ci.population) AS city_population, ROUND(100*(SUM(ci.population)/c.population)) AS city_population_percent
FROM country AS c
JOIN city AS ci
ON c.code = ci.countrycode
WHERE c.continent = 'Europe'
**AND ROUND(100*(SUM(ci.population)/c.population)) > 30**
GROUP BY c.name
Run Code Online (Sandbox Code Playgroud)

那是我得到的时候:

错误代码1111.无效使用组功能

也就是说,当我在以下情况中添加此条件时,它会失败WHERE:

AND ROUND(100*(SUM(ci.population)/c.population)) > 30
Run Code Online (Sandbox Code Playgroud)

Sur*_*rgy 30

所以你必须将这个条件移到HAVING子句中

SELECT c.name AS country_name, c.population AS country_population, SUM(ci.population) AS city_population, ROUND(100*(SUM(ci.population)/c.population)) AS city_population_percent
            FROM country AS c
            JOIN city AS ci
            ON c.code = ci.countrycode
WHERE c.continent = 'Europe'
GROUP BY c.name
HAVING ROUND(100*(SUM(ci.population)/c.population)) > 30
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记,`group by`的无效使用只会返回可能不正确结果的随机数据. (3认同)

nos*_*nos 5

您在where子句中使用聚合函数,而SQL中无法做到这一点。

改用HAVING子句:

WHERE c.continent = 'Europe'
GROUP BY c.name
HAVING ROUND(100*(SUM(ci.population)/c.population)) > 30
Run Code Online (Sandbox Code Playgroud)