powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Интересная задача с нарастающим итогом
2 сообщений из 2, страница 1 из 1
Интересная задача с нарастающим итогом
    #39721347
DimaAmid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую форумчане. У меня появилась задача, которую я не могу осилить. Вот суть:
Есть некоторый договор 1000000000 с двумя дочерними договорами: 1000000002 и 1000000003.
На этих договорах отрицательный баланс -200 и -1000 соответственно.
Поступает два платежа на договор 1000000000 на 800 и 2000р.
Задача: погасить долг на всех дочерних договорах за счет поступивших на родительский платежей.
То есть нужно рассчитать суммы, которые будем списывать с платежа для погашения долга.
Далее, на примере, я объясню, как это должно работать.
PayAmount + SUM(CustAccount) OVER ()
ContractId ChildContractId PayId CustAccount PayAmount SumAccountAmount
1000000000 1000000002 1000000752 -200,00 800,00 600,00
1000000000 1000000003 1000000752 -1000,00 800,00 -400,00
1000000000 1000000002 1000000753 -200,00 2000,00 1800,00
1000000000 1000000003 1000000753 -1000,00 2000,00 800,00
В приведенной таблице записи сгруппированы по PayId специально, чтобы расходовать платежи по возможности целиком.
В вычисляемой колонке SumAccountAmount мы будем использовать нарастающий итог, суммируя балансы дочерних договоров.
PayAmount + SUM(CustAccount) OVER (Partition PayId Order by ChildContractId)
Таким образом, мы получили сумму -200 + 800 = 600. Это остаток от первого платежа.
Далее, благодаря нарастающему итогу мы производим такую сумму: -1000 + 600 = -400.
На этом расчет первой группы с PayId = 1000000752 завершен.
Проблема: при расчете второй группы 1000000753 нужно учитывать результаты предыдущей.
Фактически же расчет второй группы идет заново, и мы получаем суммы -200 + 2000 = 1800 и -1000 + 1800 = 800.
По идее мне нужно во второй группе из платежа 2000 вычесть 400 задолженности по ChildContractId = 1000000003, которые я получил в предыдущей группе.
Так, что результат вычисляемой колонки для этой таблицы должен выглядеть так:
ContractId ChildContractId PayId CustAccount PayAmount SumAccountAmount
1000000000 1000000002 1000000752 -200,00 800,00 600,00
1000000000 1000000003 1000000752 -1000,00 800,00 -400,00
1000000000 1000000002 1000000753 -200,00 2000,00
1000000000 1000000003 1000000753 -1000,00 2000,00 1800,00
Во второй группе, первую запись мы должны исключить из рассмотрения, т.к. весь долг по договору 1000000002 был погашен в первой группе.
Хочется решить задачу в один запрос.
...
Рейтинг: 0 / 0
Интересная задача с нарастающим итогом
    #39721354
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Интересная задача с нарастающим итогом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]