В таблице payments три строки со значениями amount: NULL, NULL, NULL. Что вернут запросы SELECT SUM(amount) и SELECT SUM(COALESCE(amount, 0))?

AОба запроса вернут NULL, потому что SUM всегда наследует NULL от значений столбца
BSUM(amount) вернёт 0, а SUM(COALESCE(amount, 0)) вернёт NULL из-за пустого набора значений
CSUM(amount) вернёт NULL, а SUM(COALESCE(amount, 0)) вернёт 0, потому что COALESCE заменяет каждый NULL на 0
DОба запроса вернут 0, потому что агрегаты на пустых данных по правилам SQL дают 0 по умолчанию
Правильный ответ. Агрегаты пропускают NULL, но если все значения NULL, SUM возвращает NULL; COALESCE превращает NULL в 0 до суммирования.

Разбор

SUM пропускает NULL, но если ни одного не-NULL значения не нашлось, агрегат возвращает NULL — складывать нечего. Если же сначала применить COALESCE(amount, 0), то каждое NULL превратится в 0, и сумма станет 0. Это типичный приём для устойчивых метрик, когда отсутствие значения нужно трактовать как ноль. Поэтому два запроса дают разный результат: NULL и 0 соответственно.

Проверь себя · 1/3разбор после ответа
Дано выражение: CASE WHEN status = 'paid' THEN amount ELSE 0 END. Что вернётся, если status равно NULL, а amount равно 500?
Тренировать SQL в Telegram

Ещё вопросы по теме «Выражения и NULL»