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

AНаписать условие WHERE status = 'active' перед GROUP BY, чтобы убрать лишние строки
BДобавить FILTER (WHERE status = 'active') после агрегатной функции в 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).

Проверь себя · 1/3разбор после ответа
Что вернёт запрос SELECT AVG(salary) FROM employees;?
Тренировать SQL в Telegram

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