Почему в GROUP BY нужно указывать все поля
Что проверяют
Знаете ли вы правило точно, а не примерно. Формулировка вопроса сама по себе неверна, и сильный кандидат её поправит: указывать надо не все поля, а все неагрегированные поля из выборки.
Как отвечать
После группировки одна строка результата это целая группа исходных строк. Для колонки, которая не входит ни в ключ группировки, ни в агрегатную функцию, внутри группы может оказаться несколько разных значений, и выбрать из них одно база не вправе. Такой запрос неоднозначен, поэтому стандарт его запрещает.
select seller_id, count(*)
from sales
group by seller_id;Этот запрос корректен: колонки с датой в выборке нет, значит и в группировке она не нужна. Ошибка возникнет, если добавить дату в список выбираемых полей и не добавить в группировку.
Стоит знать исключение про функциональную зависимость: при группировке по первичному ключу остальные колонки той же таблицы разрешено брать без агрегата, потому что ключ определяет их однозначно. PostgreSQL это поддерживает, и запрос с группировкой по идентификатору пользователя и выводом его имени работает.
Отсюда же миф «в MySQL можно всё». Раньше сервер молча возвращал произвольное значение из группы, сейчас по умолчанию включён режим ONLY_FULL_GROUP_BY, и такие запросы падают. Если значение действительно любое, это пишется явно: min(col) или any_value(col).
Где спотыкаются
Понимают правило буквально и перечисляют в группировке все колонки таблицы. Лишняя колонка дробит группы: вместо строки на продавца получается строка на каждую пару продавца и даты, ошибка исчезает, а цифры в отчёте становятся неверными.
Второе: не различают where и having. Фильтр по исходным строкам должен стоять до группировки, иначе агрегаты считаются по лишним данным, а условие на результат агрегата в where попросту не работает.
Третье: берут группировку там, где нужна оконная функция. Если требуется и сумма по группе, и сами строки, группировка их схлопнет, а count(*) over (partition by seller_id) оставит детализацию на месте.