Есть 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) суммируют идентификаторы и считают не ту величину.

Проверь себя · 1/3разбор после ответа
Есть выражение для маржи: revenue - cost. Что получится, если revenue = 1000, а cost = NULL? И какой вариант устойчиво вернёт 1000 при пропущенном cost?
Тренировать SQL в Telegram

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