SQL COUNT FILTER: посчитать несколько условий в одной группе

Категория: Postgresql · Язык: SQL · Обновлено:

FILTER позволяет вычислить несколько условных агрегатов по одной группе, не повторяя CASE во всём запросе. Это удобно для отчёта, где нужны отдельные счётчики по статусам. ??????? ????????? ?????? ?? ????????? ??????? ? ??????? ???? ?????????? ?? ????? ??????.

Рабочий пример

SQL
WITH payments(status, amount) AS (
  VALUES ('paid', 10), ('failed', 0), ('paid', 20)
)
SELECT count(*) AS total,
       count(*) FILTER (WHERE status = 'paid') AS paid_count,
       sum(amount) FILTER (WHERE status = 'failed') AS failed_amount
FROM payments;

FILTER относится только к конкретной агрегатной функции. Для переносимого SQL выразите условный count через SUM(CASE WHEN ... THEN 1 ELSE 0 END).

Частый вопрос

Работает ли FILTER в MySQL?

Нет, синтаксис FILTER поддерживается PostgreSQL и некоторыми другими СУБД. Для MySQL используйте SUM(CASE WHEN условие THEN 1 ELSE 0 END).