我在光标内放置了以下代码,由于性能问题,必须删除光标。我正在尝试使用基于集合的方法,我必须根据基于集合的方法用SQL查询替换chrome
和@OriginalValue
变量,但同时我需要在每行执行以下计算(使用值@Per_Month
和@OriginalValue
)
如果我用SQL查询@Per_Month
替换@OriginalValue
和@Per_Month
“,在这种情况下,下面提到的代码不会以行方式产生结果。
EG。为下面的记录声明了游标:
SELECT OriginalValue and Per_Month FROM tblreport where reportDate = GETDATE()
代码:
OriginalValue Per_Month
------------------------
100 1
200 3
600 4
500 7
我是否可以使用基于集合的方法执行基于行的计算?
答案 0 :(得分:0)
您可以使用CTE获取列的运行总计。假设@ Value1,@ Method是静态int
declare @Value1 int = 0, @Method int = 1
declare @Data table (Id int identity(1,1), OriginalValue int, Per_Month int)
insert @Data values (100, 1), (200, 3), (600, 4), (500, 7)
;with base as
(
-- Your original logic
select
*,
power(1 + (@Value1 / 100.0), OriginalValue) + (Per_Month / 100.0)
*
(
CASE
WHEN OriginalValue = 0 THEN 1
ELSE
CASE
WHEN (@Value1 / 100.0)<> 0 THEN (power(1 + (@Value1 / 100.0), OriginalValue) - 1) / (@Value1 / 100.0) * (1 + (@Value1 / 100.0) * @Method)
ELSE OriginalValue
END
END
) CalLogic
from @Data
),
runningTotal as
(
select *, CalLogic AS Total from base where Id = 1
union all
select nxt.*, curr.Total * nxt.CalLogic from runningTotal curr inner join base nxt on curr.Id + 1 = nxt.Id
)
select * from runningTotal