如何使用基于集合的方法为每个行值运行sql查询

时间:2015-07-02 07:19:21

标签: sql-server

我在光标内放置了以下代码,由于性能问题,必须删除光标。我正在尝试使用基于集合的方法,我必须根据基于集合的方法用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

我是否可以使用基于集合的方法执行基于行的计算?

1 个答案:

答案 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