Два выражения: SUM(CASE WHEN status='paid' THEN amount END) и SUM(amount) FILTER (WHERE status='paid'). Что верно?
AТолько
FILTER учитывает строки, где условие ложно — CASE WHEN всегда их игнорируетBТолько
SUM(CASE WHEN ...) подходит для GROUP BY-запросов, FILTER — только для оконных функцийCРезультаты различаются:
FILTER суммирует строки, а CASE WHEN считает совпадения с условиемDОба выражения дают одинаковый результат: суммируют
amount только по строкам, где status = 'paid'Правильный ответ. Оба выражения семантически эквивалентны: суммируют
amount только по строкам, где status='paid', для остальных строк значения игнорируются.Разбор
SUM(CASE WHEN cond THEN val END) возвращает NULL для не совпавших строк (нет ELSE), а SUM игнорирует NULL — итог: суммируются только строки, где условие истинно. SUM(val) FILTER (WHERE cond) делает то же самое через более явный синтаксис. Разница лишь в стиле: FILTER — стандарт SQL:2003, читается чище; CASE WHEN — универсален для всех СУБД.
Проверь себя · 1/3разбор после ответа
Есть таблица
payments(amount), в части строк amount равно NULL. Какой запрос посчитает количество всех строк в таблице, включая строки с NULL в amount?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT`?
- Что делает `HAVING`?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице `users` есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →