Обновить

Покупка в сентябре, возврат в октябре. Почему два отчёта показывают разные суммы

Пример: 15 сентября покупатель заплатил 1000, а 5 октября получил частичный возврат 400. Других операций нет. Какую сумму показать за сентябрь — 1000 или 600 р.? Ответ зависит от вопроса, на который отвечает отчёт.

Разберём два управленческих отчёта по платежам. Берём только успешно проведённые оплаты и возвраты, без комиссий. Срез — на начало 28 октября 2026 года. В учебной базе даты записаны в одном часовом поясе, суммы — целыми копейками.

Данные для SQLite:

CREATE TABLE payments (  id INTEGER PRIMARY KEY,  paid_at TEXT,  amount_kopeks INTEGER
);
CREATE TABLE refunds (  id INTEGER PRIMARY KEY,  payment_id INTEGER,  refunded_at TEXT,  amount_kopeks INTEGER
);
INSERT INTO payments VALUES (1, '2026-09-15', 100000);
INSERT INTO refunds VALUES (1, 1, '2026-10-05', 40000);

Первый вопрос: сколько поступило и сколько вернули в каждом месяце? Оплату относим к дате оплаты, возврат — к дате возврата.

SELECT substr(event_at, 1, 7) AS month,       SUM(delta_kopeks) AS net_kopeks
FROM (  SELECT paid_at AS event_at,         amount_kopeks AS delta_kopeks  FROM payments  WHERE paid_at < '2026-10-28'  UNION ALL  SELECT refunded_at, -amount_kopeks  FROM refunds  WHERE refunded_at < '2026-10-28'
)
GROUP BY month
ORDER BY month;

Результат: сентябрь +100 000 копеек, октябрь −40 000. То есть +1000 ₽ и −400 ₽ соответственно.

Второй вопрос: сколько осталось от покупок каждого месяца после известных на дату среза возвратов? Здесь возврат связываем с исходной покупкой.

WITH refunded AS (  SELECT payment_id, SUM(amount_kopeks) AS returned  FROM refunds  WHERE refunded_at < '2026-10-28'  GROUP BY payment_id
)
SELECT substr(p.paid_at, 1, 7) AS purchase_month,       SUM(p.amount_kopeks - COALESCE(r.returned, 0))         AS net_kopeks
FROM payments p
LEFT JOIN refunded r ON r.payment_id = p.id
WHERE p.paid_at < '2026-10-28'
GROUP BY purchase_month
ORDER BY purchase_month;

Теперь за сентябрь получается 60 000 копеек, или 600 ₽. Октябрьской строки нет: новых покупок в октябре не было.Возвраты сначала суммируются по платежу. Поэтому несколько частичных возвратов не размножат исходную сумму при соединении таблиц. Оба результата корректны для своих вопросов. Первый показывает операции по месяцам. Второй — сумму покупок месяца после возвратов, известных на дату среза. Он может измениться, если позже появится ещё один возврат.

У первого отчёта за сентябрь останется 1000, у второго — уже 600 ₽. Поэтому рядом с показателем нужны правило отнесения возвратов и дата среза. Одной подписи «продажи за месяц» здесь недостаточно.

Теги:
0
Комментарии0

Чем заменить Claude или Gemini после блокировки

Меня тоже заблокировали, и я пошёл разбираться, чем теперь пользоваться. Хотелось найти замену для работы с кодом и файлами и понять, сколько она будет стоить. Вот что получилось на ноябрь 2026 года.

Чем заменить Claude или Gemini после блокировки

Публикации