Возраст дебиторской задолженности в 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.
