Неагрегированный столбец стоит рядом с COUNT(*) при неполном GROUP BY и даёт бессмыслицу — исправьте
Запрос должен считать сотрудников по отделам, но возвращает неверное, произвольное имя отдела рядом с каждым счётчиком:
SELECT department_id, department_name, COUNT(*)
FROM employees
GROUP BY department_id;
department_name отсутствует в GROUP BY. Объясните, что с ним делает движок, и исправьте запрос.
department_name не сгруппирован и не агрегирован — это некорректный SQL. Строгие СУБД его отвергают; MySQL в нестрогом режиме берёт произвольное значение строки — отсюда бессмыслица. Исправить — добавить его в GROUP BY или обернуть в MIN/MAX.
- ✗Считать, что функционально зависимый столбец подставляется автоматически
- ✗Винить отображение или collation вместо правила о негруппированном столбце
- ✗Думать, что именно COUNT(*) делает запрос некорректным
- →Почему строгий и нестрогий режимы SQL расходятся в том, запустится ли это?
- →Когда исключение о функциональной зависимости для GROUP BY действительно допустимо?
The SELECT list has a column, department_name, that is neither in the GROUP BY nor wrapped in an aggregate. That violates the grouping rule: each output row represents a whole group, but department_name has one value per underlying row, so the engine has no single defined value to show.
Strict engines (PostgreSQL, or MySQL with ONLY_FULL_GROUP_BY) reject the query outright. MySQL in a permissive mode runs it and returns an arbitrary row's department_name from each group — which looks like nonsense.
Fix by making the grouping match the select list:
SELECT department_id, department_name, COUNT(*) AS n
FROM employees
GROUP BY department_id, department_name;
Because department_name is functionally determined by department_id, adding it to GROUP BY does not change the number of groups. Alternatively, wrap it as MIN(department_name) if you must group by the id alone.