Привет! Я Андрей, продуктовый аналитик в Авито.
Помогаю джуниор-аналитикам расти осознанно: строить карьерный трек, прокачивать софт-скилы и использовать AI в работе.
Если хочешь разобраться, куда двигаться дальше, пиши @TarkoAndrey
Post #83
9
После JOIN выручка выросла, хотя продаж больше не стало
Иногда для роста выручки достаточно добавить в запрос один JOIN. Правда, растёт она только в отчёте.
Допустим, покупатель оформил заказ суммарно на 1 000 рублей. Внутри заказа три товара: футболка, носки и кепка.
В таблице заказов этому заказу соответствует одна строка с общей суммой. В таблице товаров заказа три строки, по одной на каждую позицию.
Соединяем таблицы по номеру заказа, чтобы добавить названия товаров. Получаем три строки. И в каждой из них повторяется сумма всего заказа:
- футболка — сумма заказа 1 000 ₽;
- носки — сумма заказа 1 000 ₽;
- кепка — сумма заказа 1 000 ₽.
Теперь считаем
На одном заказе всё очевидно. В запросе с несколькими таблицами такую историю заметить сложнее. Особенно если сумма выросла на несколько процентов и выглядит вполне правдоподобно.
SQL при этом не выдаст ошибку. Для каждого товара он нашёл соответствующий заказ и подставил его данные. Всё по инструкции.
Изменилось то, что означает одна строка.
До соединения одна строка была одним заказом. После джойна одной товарной позицией. А складывать мы продолжаем суммы заказов, которые теперь повторяются.
Исправление зависит от задачи.
Если нужна общая выручка по заказам, её можно посчитать прямо в таблице заказов. Если нужны ещё и сведения о товарах, например, количество позиций, сначала собрать их до одной строки на заказ, а затем присоединить.
Для выручки по товарам нужно брать стоимость самих позиций с учётом количества и скидок. Сумму всего заказа к каждому товару приписывать нельзя.
И здесь легко попасть во вторую ловушку: написать
Поэтому после соединения полезно проверить три вещи:
- сколько стало строк и ожидали ли мы такое количество;
- сколько осталось уникальных заказов;
- что произошло с контрольной суммой на том же наборе заказов.
Я, очень часто, смотрю промежуточные таблицы глазами, перед тем как приджойнивать их. Это помогает не допускать подобных ошибок.
А у вас бывало, что после
Иногда для роста выручки достаточно добавить в запрос один JOIN. Правда, растёт она только в отчёте.
Допустим, покупатель оформил заказ суммарно на 1 000 рублей. Внутри заказа три товара: футболка, носки и кепка.
В таблице заказов этому заказу соответствует одна строка с общей суммой. В таблице товаров заказа три строки, по одной на каждую позицию.
Соединяем таблицы по номеру заказа, чтобы добавить названия товаров. Получаем три строки. И в каждой из них повторяется сумма всего заказа:
- футболка — сумма заказа 1 000 ₽;
- носки — сумма заказа 1 000 ₽;
- кепка — сумма заказа 1 000 ₽.
Теперь считаем
SUM(order_total) и получаем 3 000 рублей. Покупатель заплатил тысячу, а отчёт уже перевыполнил план.На одном заказе всё очевидно. В запросе с несколькими таблицами такую историю заметить сложнее. Особенно если сумма выросла на несколько процентов и выглядит вполне правдоподобно.
SQL при этом не выдаст ошибку. Для каждого товара он нашёл соответствующий заказ и подставил его данные. Всё по инструкции.
Изменилось то, что означает одна строка.
До соединения одна строка была одним заказом. После джойна одной товарной позицией. А складывать мы продолжаем суммы заказов, которые теперь повторяются.
Исправление зависит от задачи.
Если нужна общая выручка по заказам, её можно посчитать прямо в таблице заказов. Если нужны ещё и сведения о товарах, например, количество позиций, сначала собрать их до одной строки на заказ, а затем присоединить.
Для выручки по товарам нужно брать стоимость самих позиций с учётом количества и скидок. Сумму всего заказа к каждому товару приписывать нельзя.
И здесь легко попасть во вторую ловушку: написать
SUM(DISTINCT order_total). На одном заказе поможет. Но два разных заказа по тысяче рублей превратятся в одну тысячу: DISTINCT различает значения суммы, а не заказы.Поэтому после соединения полезно проверить три вещи:
- сколько стало строк и ожидали ли мы такое количество;
- сколько осталось уникальных заказов;
- что произошло с контрольной суммой на том же наборе заказов.
Я, очень часто, смотрю промежуточные таблицы глазами, перед тем как приджойнивать их. Это помогает не допускать подобных ошибок.
А у вас бывало, что после
JOIN цифры вдруг становились подозрительно хорошими?







