Человек ничего не потратил или просто не ответил на вопрос? На примере короткого опроса объясняем NULL и показываем, почему пропуски меняют смысл отчёта.
Один пустой ответ — несколько возможных историй
Представьте короткий опрос: «Сколько вы потратили на книги в этом месяце?» Анна ответила: 0 рублей. Борис — 2 000 рублей. Вера оставила поле пустым. Все трое участвовали в опросе, но сведения о расходах есть только у двоих.
Если записать Вере ноль, мы незаметно добавим факт, которого она не сообщала. Возможно, она ничего не покупала. Возможно, не помнит сумму или не хочет отвечать. Из одного пропуска выбрать версию нельзя. В работе с данными эта разница имеет большое значение.
Как обозначают отсутствие значения
В SQL используют NULL — специальное обозначение отсутствующего значения. SQL — язык для работы с данными в базе. Здесь нам достаточно понять смысл: ноль сообщает известное количество, а NULL не сообщает значение поля.
В PostgreSQL обычное сравнение с NULL даёт неопределённый результат, а для проверки отсутствия значения предусмотрены отдельные средства. Такое поведение описано в официальной документации. Это помогает не приравнивать неизвестное к достоверному ответу.
Само обозначение не объясняет причину пропуска. Если причина важна, её нужно хранить отдельно: например, отличать «не ответил» от «вопрос не относится к участнику».
Почему среднее получается неожиданным
Вернёмся к условному опросу. У Анны и Бориса вместе 2 000 рублей расходов. Среди двух известных ответов среднее равно 1 000 рублей. Это можно честно подписать: «Средние расходы среди ответивших на вопрос».
Если вместо пропуска Веры поставить ноль, среднее по трём участникам будет примерно 667 рублей. Число заметно меньше, хотя новых сведений о покупках не появилось. Изменилось наше предположение.
В PostgreSQL среднее по столбцу вычисляется по значениям, отличным от NULL. Подсчёт всех строк и подсчёт заполненных значений тоже отвечают на разные вопросы. Правила приведены в документации по агрегатным функциям.
Куда пропадают участники при отборе
Допустим, редактор хочет разделить участников на тех, кто покупал книги, и тех, кто не покупал. Борис попадёт в первую группу, Анна — во вторую. Веру пока нельзя уверенно отнести ни к одной.
Если показать только две группы, читатель может решить, что опрос прошли два человека. Но участников было трое. Поэтому в отчёте полезна отдельная строка «нет ответа» и явное число участников, по которым известна сумма.
Подобная ситуация возникает не только в опросах. Дата доставки может ещё не наступить, номер телефона — не быть указан, а показатель за день — не поступить из источника. Для каждого случая нужно решить, что означает отсутствие сведений.
Когда можно использовать ноль
Ноль уместен, когда он соответствует известному факту или явно согласованному правилу. Анна указала нулевые расходы — в нашем примере это полноценный ответ. С Верой такой уверенности нет.
Иногда для расчёта принимают допущение. Тогда его нужно назвать и показать, как оно влияет на результат. Фраза «все пропуски приняли за нулевые расходы» сообщает больше, чем график с точным числом и скрытой методикой.
Не стоит исправлять пропуски только ради того, чтобы таблица выглядела заполненной. Сначала полезно выяснить, можно ли получить недостающие сведения, нужно ли выделить отдельную группу или вообще отказаться от вывода, для которого данных мало.
Как читать такой отчёт внимательнее
Перед выводами задайте автору несколько простых вопросов. Они пригодятся и без знания SQL:
- Сколько всего записей и сколько заполненных ответов?
- Что означает пустое поле именно в этой таблице?
- По кому рассчитано среднее?
- Заменяли ли пропуски какими-либо значениями?
- Видна ли группа, о которой информации пока нет?
В нашем опросе достаточно написать: «Три участника, два ответа о расходах, среднее среди ответивших — 1 000 рублей». Такая формулировка не скрывает Веру и не придумывает за неё сумму. Умение замечать подобные детали помогает понимать отчёты и обсуждать их с аналитиками.
Куда двигаться дальше
Если хочется самостоятельно проверять данные, а не только читать готовые графики, посмотрите программу курса «SQL инженер». Понимание пропусков и смысла показателей — хорошая отправная точка для знакомства с языком.