powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013
4 сообщений из 4, страница 1 из 1
Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013
    #39751343
Sergey3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат запроса должен посчитать общую сумму amt, выдать строки с ID и amt,
1. чтобы в сумме они дали общую сумму по запросу, т.е. 60
2. изменить в этих выданных строках amt так чтоб в сумме получилось 60
3. не выводить строки, которые сократились
4. в идеале чтобы в 1ю очередь сократились строки с противоположными amt, т.е. 20 и -20
5. посчитать коэфф. уменьшения т.е. на сколько уменьшился amt для каждой записи

Код: sql
1.
2.
3.
4.
5.
6.
7.
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 rsum6 -20 60 -201 -10 60 -303 20 60 -104 30 60 202 40 60 60

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

WBR, Serge
...
Рейтинг: 0 / 0
Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013
    #39751352
Sergey3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильный желаемый результат
ID amt scl 4 20 0.66 2 40 1.00
...
Рейтинг: 0 / 0
Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013
    #39751399
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey3,

30, 40, -10 также подходит под условие. Вам требуется создать все сочетания значений наборов и из массива наборов выбрать нужные.
Это задача не для SQL, в общем-то.
...
Рейтинг: 0 / 0
Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013
    #39752245
Sergey3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
родил сам:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пятничная задачка: Netting - сокращение сумм с противоположными знаками. MSSQL 2013
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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