Есть LEFT JOIN пользователей с их платежами. Если у пользователя нет платежей, payments.amount будет NULL. Как правильно посчитать «выручку на пользователя», трактуя отсутствие платежей как 0?

ASUM(payments.amount) / COUNT(users.user_id)
BSUM(users.user_id) / COUNT(COALESCE(payments.amount, 0))
CCOUNT(payments.amount) / SUM(users.user_id)
DSUM(COALESCE(payments.amount, 0)) / COUNT(users.user_id)
Правильный ответ. После LEFT JOIN отсутствующие значения становятся NULL; для метрик их подставляют как 0 через COALESCE перед агрегированием.

Разбор

При LEFT JOIN строки без совпадений получают NULL в полях правой таблицы. Если отсутствие платежей трактуется как 0, безопаснее заменить payments.amount на 0 до суммирования: SUM(COALESCE(payments.amount, 0)). Деление на COUNT(users.user_id) даёт среднее по всем пользователям, включая тех, у кого платежей не было. SUM сам по себе пропускает NULL, а формулы с SUM(user_id) или COUNT(amount) / SUM(user_id) суммируют идентификаторы и считают не ту величину.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

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