Почему после объединения таблиц увеличилась сумма продаж

Почему сумма заказов растёт после соединения таблиц, хотя новых продаж нет. Разбираем детализацию, повторение строк и безопасную проверку результата.

Две оранжевые папки связаны с разным количеством посылок — образ связей между записями

Продажи не выросли, а отчёт показывает рост

Представим условный магазин. В одной таблице хранится заказ стоимостью 1 200 рублей. В другой — три товара этого заказа. Аналитик соединяет таблицы, чтобы добавить названия товаров к продажам, а затем складывает стоимость заказа. В отчёте появляется 3 600 рублей, хотя покупатель заплатил только 1 200.

Такое расхождение возможно даже при правильных исходных данных. После соединения одна строка заказа оказалась представлена трижды — по одному разу для каждого товара. Повторилось не событие продажи, а значение, которое относилось к заказу целиком.

Сначала определите, что означает строка

Детализация — это уровень, на котором записаны данные. Одна строка может означать заказ, товар внутри заказа, платёж или отдельную доставку. Эти сущности связаны, но не взаимозаменяемы. В нашем примере первая таблица описывает заказы, вторая — товарные позиции.

В документации PostgreSQL о соединении таблиц объясняется: для строки одной стороны результат включает каждую подходящую строку другой. Поэтому несколько совпадений закономерно дают несколько строк. Само соединение не обязано сохранять исходное количество заказов или сумму их стоимости.

Почему уникальный номер заказа не спасает

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

Ситуация усложняется, если к товарам добавляют ещё и платежи. В условном заказе с тремя товарами и двумя платежами соединение только по номеру заказа способно дать шесть сочетаний. Это не шесть покупок. Именно поэтому при объединении наборов нужно заранее назвать ожидаемый смысл каждой результирующей строки.

Как проверить причину без сложных инструментов

Выберите один заказ, по которому известна реальная сумма. Посмотрите, сколько строк было до соединения и сколько получилось после. Найдите повторяющееся значение стоимости и проверьте, к чему оно относится. Затем сравните число различных заказов, число товарных строк и общий итог по деньгам.

Если заказ повторился три раза, а сумма выросла втрое, это полезная зацепка, но ещё не универсальное доказательство. В других заказах может быть иное число товаров, часть строк может отсеяться. Поэтому после локального объяснения нужно сверить весь набор, а не исправлять итог одним произвольным коэффициентом.

Что изменить в расчёте

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

Безусловно удалять повторяющиеся суммы нельзя: два разных заказа вправе иметь одинаковую стоимость. Нельзя и делить итог на число товаров для всех заказов сразу. Решение зависит от смысла показателя. В рекомендациях Microsoft по связям между таблицами отдельно рассматриваются сложности соединения таблиц фактов — наборов, описывающих события и измеряемые значения.

Какая договорённость предотвращает повтор

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

Такой подход помогает объяснить проблему и аналитику, и руководителю. Вопрос звучит не «почему база неправильно считает», а «какой объект мы считаем после изменения детализации». Когда это определено, выбрать корректный способ подготовки отчёта становится значительно проще.

Читайте также

Что изучать дальше

Если хотите разобраться в работе с данными системно, посмотрите программу «SQL инженер» в NovaData. Сравните темы и требования к подготовке со своими задачами: этот пример помогает сформулировать вопросы, с которыми можно прийти на обучение.

SQL инженер
Курс
Доступ сразу
SQL инженер

SQL инженер — это специалист, который работает с базами данных, разрабатывает запросы, оптимизирует хранение данных и обеспечивает эффективную работу с информацией в компаниях.

С нуля до junior
Теория и практика
Диплом по окончании
500
₽/мес
УЗНАТЬ ПОДРОБНЕЕ

Источники

Читайте также

Обучить команду или нанять специалиста по данным: как выбрать
47

Обучить команду или нанять специалиста по данным: как выбрать

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

Вертикальное и горизонтальное масштабирование данных: в чём разница

Когда системе добавляют мощность одного сервера, когда делят работу между несколькими и почему увеличение ресурсов само по себе не решает любую проблему.
Журнал изменений данных: как выяснить, кто и когда изменил набор
42

Журнал изменений данных: как выяснить, кто и когда изменил набор

Что можно узнать из журнала действий с данными, как он помогает разбирать ошибки и почему его записи не показывают всю историю сами по себе.

Занятия проходят
в Нова Дата СДО

Вебинары, практика и общение с преподавателем — в одном окне браузера.

Посмотреть интерфейс платформы
Календарь обучения в Нова Дата СДО
Курсы студента в Нова Дата СДО
Редактор кода для практики в Нова Дата СДО
Вебинары и расписание Ваши курсы Код в браузере
Нова Дата СДО — в реестре российского ПОРеестровая запись № 34931
Заявка отправлена
Отправим вам подборку курсов в течение 5 минут. С вами также свяжется наш специалист и даст карьерную консультацию.
Персональный промокод
На курс «Инженер по парсингу данных»
Введите код при оплате, чтобы применить скидку к программе.