Прогрессивное/составное вычитание SQL Server?

У меня есть таблица, которая выглядит так, как показано ниже. Я пытаюсь выяснить, как обновить столбец «endval» со ​​значением из столбца «startval», уменьшенным на 10% для каждого кратного 5 в столбце «эффект».

declare @tbl table ( rowid int , effect Int , startval decimal(6,2) , endval decimal(6,2) )
insert @tbl values 
  ( 0 , 10 , 6 , null )   -- expect 4.86 in endval
, ( 1 , 40 , 10 , null  ) -- expect 4.30 in endval
, ( 2 , 7  , 1 , null ) -- expect .9 in endval
select * from @tbl

Обратите внимание, что rowid 2 не имеет четного числа, кратного 5, в столбце «эффект», поэтому он уменьшается на 10% только один раз.

Я пытаюсь придумать какой-либо способ «прогрессивно увеличивать процент» в TSQL (2012), и ничего не приходит на ум. Помощь?

Спасибо.


person Snowy    schedule 27.04.2013    source источник


Ответы (1)


Используйте POWER, чтобы применить несколько процентов.

declare @tbl table ( rowid int , effect Int , startval decimal(6,2) , endval decimal(6,2) )
insert @tbl values 
      ( 0 , 10 , 6 , null )   -- expect 4.86 in endval
    , ( 1 , 40 , 10 , null  ) -- expect 4.30 in endval
    , ( 2 , 7  , 1 , null ) -- expect .9 in endval

select  rowid, startval, [endval]=power(0.90, effect/5)*startval
from    @tbl;

Полученные результаты:

rowid   startval    endval
0       6.00        4.8600
1       10.00       4.3000
2       1.00        0.9000

Простой цикл в cte также сделает это:

;with cte (rowid, calc, i) as
(
    select  rowid, startval, effect/5
    from    @tbl
    union all
    select  t.rowid, cast(calc*.9 as decimal(6,2)), i-1
    from    @tbl t
    join    cte c on 
            c.rowid = t.rowid
    where   c.i > 0
)
select  * 
from    cte c
where   i = 0
order
by      rowid;

Полученные результаты:

rowid   calc    i

0       4.86    0
1       4.30    0
2       0.90    0
person Nathan Skerl    schedule 27.04.2013