В 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 BYCВынести выражение
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'). Что верно?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT`?
- Что делает `HAVING`?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице `users` есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →