В PostgreSQL нужно посчитать сумму продаж только по активным клиентам, при этом не исключая остальных клиентов из итоговой выборки. Какой синтаксис подойдёт?
AНаписать
WHERE status = 'active' перед GROUP BY, чтобы убрать неактивных клиентов из выборкиBДобавить
FILTER (WHERE status = 'active') после агрегатной функции SUM в SELECTCИспользовать
HAVING status = 'active' после GROUP BY для фильтрации итоговых групп клиентовDПоместить условие в
ON при JOIN со вспомогательной таблицей статусов клиентовПравильный ответ.
FILTER (WHERE ...) применяется к конкретной агрегатной функции и не влияет на остальные агрегаты в SELECT.Разбор
Синтаксис aggregate_func(...) FILTER (WHERE condition) — стандарт SQL:2003, реализованный в PostgreSQL. Он позволяет фильтровать строки для одного агрегата независимо от других: SUM(amount) FILTER (WHERE status='active') суммирует только активных клиентов, а COUNT(*) той же группы посчитает всех. Это чище, чем SUM(CASE WHEN status='active' THEN amount END), и сразу читается. Условие в WHERE отфильтровало бы неактивных клиентов вообще, что не соответствует задаче.
Проверь себя · 1/3разбор после ответа
Вы хотите вывести только те категории товаров, где суммарные продажи больше 10000. Таблица
sales с колонками category и amount. Какой запрос корректен?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT` в `SELECT`-запросе?
- Что делает оператор `HAVING` в SQL-запросе с группировкой?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице пользователей есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →