Есть LEFT JOIN пользователей с их платежами. Если у пользователя нет платежей, payments.amount будет NULL. Как правильно посчитать «выручку на пользователя», трактуя отсутствие платежей как 0?
A
SUM(payments.amount) / COUNT(users.user_id)B
SUM(users.user_id) / COUNT(COALESCE(payments.amount, 0))C
COUNT(payments.amount) / SUM(users.user_id)D
SUM(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?Ещё вопросы по теме «Выражения и NULL»
- Нужно выбрать пользователей без электронной почты. Какое условие в `WHERE` корректно найдёт строки, где `email` отсутствует?
- В таблице `orders` поле `promo_code` может быть `NULL`. Что произойдёт со строкой, где `promo_code = NULL`, при фильтре `WHERE promo_code <> 'NONE'`?
- В таблице `sessions` 5 строк. Значения `utm_source`: `'google'`, `NULL`, `'email'`, `NULL`, `NULL`. Чему равны `COUNT(*)` и `COUNT(utm_source)`?
- В таблице `payments` три строки со значениями `amount`: `NULL`, `NULL`, `NULL`. Что вернут запросы `SELECT SUM(amount)` и `SELECT SUM(COALESCE(amount, 0))`?
- Что вернёт выражение `COALESCE(NULL, NULL, 'web', 'app')`?
- Все вопросы по «Выражения и NULL» →