Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Интересная задача с нарастающим итогом  [new]
DimaAmid
Member

Откуда:
Сообщений: 1
Приветствую форумчане. У меня появилась задача, которую я не могу осилить. Вот суть:
Есть некоторый договор 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 был погашен в первой группе.
Хочется решить задачу в один запрос.
23 окт 18, 11:59    [21712133]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задача с нарастающим итогом  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
https://www.sql.ru/forum/1018035/zadachka-pro-yabloki-ili-sliyanie-2h-tablic
23 окт 18, 12:13    [21712152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить