|
Интересная задача с нарастающим итогом
|
|||
---|---|---|---|
#18+
Приветствую форумчане. У меня появилась задача, которую я не могу осилить. Вот суть: Есть некоторый договор 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.10.2018, 11:59 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1688926]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 271ms |
total: | 408ms |
0 / 0 |