Конверсия в SQL без деления на ноль и целочисленной ошибки

Доля оплат выводится как ноль, хотя три человека из десяти купили. В другом сегменте нет визитов, и расчёт ведёт себя неожиданно. Для процента нужно отдельно решить тип деления и значение показателя при пустом знаменателе.

Как разобрать ситуацию

Умножаем числитель на 1.0, чтобы в SQLite получить вещественный результат. NULLIF превращает нулевой знаменатель в NULL. В этой статье доля без наблюдений остаётся неизвестной, а не равной нулевой конверсии. Ноль означает, что визиты были, но покупок среди них не было; отсутствие визитов — иная ситуация.

Пример и ожидаемый результат

Для канала A имеем 10 визитов и 3 оплаты, для B — 0 и 0. Ожидаем 0.3 и NULL. Проценты для отображения можно получить отдельным умножением на 100.

WITH channels(name,visits,pays) AS(VALUES('A',10,3),('B',0,0)) 
SELECT name,1.0*pays/NULLIF(visits,0) 
FROM channels 
ORDER BY name;

Результат: A — 0.3, B — NULL. Это сохраняет различие между нулевым успехом и отсутствующим наблюдением.

Проверка перед применением

  • Проверьте дробь 1/3: раннее округление не должно превратить её в ноль.
  • Запретите отрицательные счётчики и оплаты больше визитов, если метрика определена по одной попытке.
  • В итоговом отчёте считайте общую долю из суммарных числителя и знаменателя, а не простое среднее процентов каналов.

Согласуйте с потребителем отчёта отображение NULL: прочерк, подпись «нет наблюдений» или скрытая точка на графике. Подстановка нуля ради удобства визуализации способна породить ложный вывод, что новый канал уже показал плохой результат, хотя его ещё никто не проверял.

Границы решения

Связь оплат с визитами здесь уже задана. Если один человек платит несколько раз, метрика по числу платежей может превысить единицу и перестанет быть долей оплативших людей.

Если запросы уже пишутся, а уверенности в кардинальности, оконных рамках и проверке результата не хватает, продолжить практику можно в нашем платном курсе

Продвинутый SQL: сложные запросы и задачи для собеседований. Перед записью сравните программу со своей задачей и подготовкой.

Техническая справка: www.sqlite.org: документация, www.sqlite.org: документация.

Следующий шаг: Сложные SQL-запросы: разборы расчётов и ошибок. По смежным вопросам: Как разбить события на сессии в SQL по паузе между действиями, Подписка на часть месяца: как посчитать пропорциональную сумму в SQL.