Возраст дебиторской задолженности в SQL: как учесть частичную оплату

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

Как разобрать ситуацию

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

Пример и ожидаемый результат

На 19 октября первый счёт на 1000 рублей со сроком 1 октября оплачен на 400: долг 600, просрочка 18 дней. Второй на 500 полностью оплачен. Третий на 300 имеет срок 25 октября и пока не просрочен.

WITH invoices(id,total,paid,due) AS(VALUES(1,1000,400,'2026-10-01'),(2,500,500,'2026-10-01'),(3,300,0,'2026-10-25')) 
SELECT id,total-paid,CAST(julianday('2026-10-19')-julianday(due) AS INT) 
FROM invoices 
WHERE total>paid AND due<'2026-10-19' 
ORDER BY id;

Запрос возвращает только первый счёт: остаток 600 и возраст 18 дней. Полностью закрытый и ещё не наступивший срок не попадают в просроченный список.

Проверка перед применением

  • Проверьте поступление после даты среза: оно не должно задним числом исчезнуть из исторической задолженности.
  • Отдельно покажите переплату и несвязанный платёж, а не смешивайте их с обычным долгом.
  • Зафиксируйте границы корзин, например 1–30 и 31–60 дней, без пересечения.

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

Границы решения

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

Если запросы уже пишутся, а уверенности в кардинальности, оконных рамках и проверке результата не хватает, продолжить практику можно в нашем платном курсе

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

Техническая справка: www.sqlite.org: документация, www.sqlite.org: документация.

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