Многие пишут
COUNT(CASE WHEN ...), хотя в SQL (например, в PostgreSQL) есть более декларативный способ - FILTER.Фильтрация применяется к агрегатной функции, а не ко всей выборке:
COUNT(*) FILTER (WHERE status = 'paid')
Строки не исключаются из
FROM, а учитываются только внутри конкретного агрегата.Можно считать несколько независимых метрик за один проход по таблице:
COUNT(*) FILTER (WHERE status = 'failed')
Оптимизатор обычно сводит такой запрос к линейному плану.
FILTER работает не только с COUNT, но и с другими агрегатами:SUM(amount) FILTER (WHERE status = 'paid')
🔥
FILTER выразит намерение напрямую: агрегат считает только нужные строки, без лишней логики.➡️ SQL Ready | #совет
