В PostgreSQL нужно посчитать сумму продаж только по активным клиентам, при этом не исключая остальных клиентов из итоговой выборки. Какой синтаксис подойдёт?

AНаписать WHERE status = 'active' перед GROUP BY, чтобы убрать неактивных клиентов из выборки
BДобавить FILTER (WHERE status = 'active') после агрегатной функции SUM в SELECT
CИспользовать 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. Какой запрос корректен?
Тренировать SQL в Telegram

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