Нужно посчитать количество оплаченных заказов (значение столбца status равно 'paid'). Какое выражение корректно вернёт число оплаченных, если в этом столбце бывают NULL?

ACOUNT(CASE WHEN status = 'paid' THEN 1 ELSE 0 END): ветка ELSE 0 учитывается в счёте как не-NULL значение
BCOUNT(status = 'paid'): выражение возвращает логический результат, который агрегатом считается напрямую
CCOUNT(CASE WHEN status = 'paid' THEN 1 END): для не-paid веток получится NULL, в счёт попадут только нужные
DCOUNT(COALESCE(status, 'paid')): значение NULL заменяется на 'paid' ещё до подсчёта строк агрегатом
Правильный ответ. COUNT(column) считает не-NULL, поэтому удобно делать COUNT(CASE WHEN ... THEN 1 END) — там NULL для не-подходящих строк.

Разбор

COUNT считает количество не-NULL значений. Если использовать COUNT(CASE WHEN status = 'paid' THEN 1 END), то для оплаченных вернётся 1, а для остальных (включая NULL) — NULL, поэтому будут посчитаны только оплаченные. Вариант с ELSE 0 неверен: 0 — это не NULL, значит будут посчитаны все строки. COALESCE(status, 'paid') подменяет NULL на 'paid' и тоже искажает счёт.

Проверь себя · 1/3разбор после ответа
Нужно выбрать пользователей без электронной почты. Какое условие в WHERE корректно найдёт строки, где email отсутствует?
Тренировать SQL в Telegram

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