Перейти к содержанию
BIMiddle≈ 25 минутУчебная задача HireHero

Почему выручка выросла после JOIN

В дашборд добавили число товарных позиций. После соединения заказов с их строками общая выручка внезапно выросла, хотя новых продаж не было.

Условие

В orders три заказа с total_amount: 1 000, 2 000 и 1 500. В order_items у них соответственно 2, 3 и 1 строка. total_amount — сумма всего заказа. Объясни, какой итог даст SUM(total_amount) после JOIN по order_id. Напиши запрос, возвращающий корректную выручку и число товарных строк. В схеме одна строка order_items соответствует одной позиции, а не количеству единиц товара.

Данные

order_idtotal_amountitem_rows
110002
220003
315001

Все данные учебные. Код можно выполнить в своей среде; поле ниже предназначено для черновика, без запуска кода.

Черновик сохраняется в этом браузере. Ничего не отправляется на сервер.

Если нужен следующий шаг

Подсказка 1
Посмотри, сколько раз после соединения повторится сумма каждого заказа.
Подсказка 2
Перед JOIN приведи товарные строки к одной строке на заказ.

Проверь себя

Показать решение и объяснение
Ошибочная сумма: 1 000 × 2 + 2 000 × 3 + 1 500 × 1 = 9 500. Правильная выручка — 4 500; товарных строк — 6.
SQL · SQLite / PostgreSQL
WITH item_counts AS (
  SELECT order_id, COUNT(*) AS item_rows
  FROM order_items
  GROUP BY order_id
)
SELECT SUM(o.total_amount) AS revenue,
       SUM(COALESCE(i.item_rows, 0)) AS item_rows
FROM orders o
LEFT JOIN item_counts i ON i.order_id = o.order_id;

JOIN изменил детализацию: одна строка заказа превратилась в несколько товарных строк. Предварительная агрегация восстанавливает связь один-к-одному. SUM(DISTINCT total_amount) не является универсальным исправлением: два разных заказа могут иметь одинаковую сумму, и один из них потеряется. LEFT JOIN сохраняет заказы без товарных строк — отдельно стоит проверить, допустимы ли они по бизнес-логике.

Проверка решения

  • Итоговая выручка совпадает с суммой исходной orders.
  • Два заказа с одинаковой суммой не схлопываются.
  • Число позиций не названо количеством проданных единиц.

Вопрос на продолжение

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