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

Откуда: Киев
Сообщений: 88
Результат запроса должен посчитать общую сумму amt, выдать строки с ID и amt,
1. чтобы в сумме они дали общую сумму по запросу, т.е. 60
2. изменить в этих выданных строках amt так чтоб в сумме получилось 60
3. не выводить строки, которые сократились
4. в идеале чтобы в 1ю очередь сократились строки с противоположными amt, т.е. 20 и -20
5. посчитать коэфф. уменьшения т.е. на сколько уменьшился amt для каждой записи

with qry as 
(select 1 ID, -10 amt union all
 select 2 ID,  40 amt union all
 select 6 ID, -20 amt union all
 select 4 ID,  30 amt union all
 select 3 ID,  20 amt )
select qry.*,sum(amt) over() allsum,sum(amt) over(order by amt) rsum  from qry


ID amt allsum rsum
6 -20 60 -20
1 -10 60 -30
3 20 60 -10
4 30 60 20
2 40 60 60


желаемый результат
ID amt scl allsum rsum
4 20 1.00 60 20
2 40 0.66 60 60


WBR, Serge
21 дек 18, 14:28    [21770520]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013  [new]
Sergey3
Member

Откуда: Киев
Сообщений: 88
правильный желаемый результат
ID amt scl
4 20 0.66
2 40 1.00
21 дек 18, 14:33    [21770531]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7671
Sergey3,

30, 40, -10 также подходит под условие. Вам требуется создать все сочетания значений наборов и из массива наборов выбрать нужные.
Это задача не для SQL, в общем-то.
21 дек 18, 15:06    [21770591]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013  [new]
Sergey3
Member

Откуда: Киев
Сообщений: 88
родил сам:

with qry as 
(select 1 ID,  50 amt union all
 select 4 ID, -20 amt union all
 select 2 ID, -20 amt union all
 select 6 ID,  80 amt union all
 select 3 ID, -90 amt )
, qry1 as (select  qry.* --TOP(100)PERCENT
,sum(amt) over() allsum
from qry )
, qry2 as (select  qry1.* from qry1 WHERE Sign(amt) = Sign(allsum))
, qry3 as (select *
,sum(amt) over(order by amt ROWS UNBOUNDED PRECEDING) rsum
 from qry2 )
select * 
, iif( Abs(rsum) <= Abs(allsum), amt, iif(Abs(amt + allsum) >  Abs(rsum), amt - (rsum - allsum) ,0))   new
, iif( Abs(rsum) <= Abs(allsum), 1, iif(Abs(amt + allsum) >  Abs(rsum), (0.0 + amt - (rsum - allsum)) / amt ,1))   scalor
from qry3
24 дек 18, 14:02    [21772065]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить