В SELECT определена колонка CASE WHEN years_exp < 1 THEN 'Junior' WHEN years_exp < 5 THEN 'Middle' ELSE 'Senior' END AS level. Как правильно сгруппировать по этому выражению в PostgreSQL?

AОбязательно повторить полное выражение CASE WHEN в GROUP BY — псевдонимы там запрещены
BВ PostgreSQL можно написать GROUP BY level — псевдоним из SELECT допустим в GROUP BY
CВынести выражение CASE WHEN в WHERE и группировать по результату фильтрации
DИспользовать HAVING level = 'Junior' вместо GROUP BY для условных выражений
Правильный ответ. PostgreSQL (в отличие от стандарта SQL) разрешает использовать псевдонимы из SELECT в GROUP BY — можно написать GROUP BY level.

Разбор

По стандарту SQL псевдоним из SELECT недоступен в GROUP BY, но PostgreSQL расширяет стандарт и позволяет это. Можно написать GROUP BY level, GROUP BY 1 (порядковый номер) или повторить выражение CASE WHEN целиком. Самый читаемый вариант — использовать псевдоним. В MySQL это тоже разрешено, а в SQL Server и Oracle — нет.

Проверь себя · 1/3разбор после ответа
Два выражения: SUM(CASE WHEN status='paid' THEN amount END) и SUM(amount) FILTER (WHERE status='paid'). Что верно?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»