Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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
желаемый результат
WBR, Serge |
|||||||||||||||||||||||||||||||||||||||||
21 дек 18, 14:28 [21770520] Ответить | Цитировать Сообщить модератору |
Sergey3 Member Откуда: Киев Сообщений: 88 |
правильный желаемый результат
|
||||||||||
21 дек 18, 14:33 [21770531] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
Sergey3, 30, 40, -10 также подходит под условие. Вам требуется создать все сочетания значений наборов и из массива наборов выбрать нужные. Это задача не для SQL, в общем-то. |
21 дек 18, 15:06 [21770591] Ответить | Цитировать Сообщить модератору |
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 | ![]() |