同一张表内、利用变化的上一行数据动态地修改下一行数据(示例Demo)

-- 同一张表内、利用变化的上一行数据动态地修改下一行数据(示例Demo)

/**/ /*
CREATETABLEAccount(
[Month][datetime]NOTNULLPrmaryKey,
[PlanFare][money]NULL,
[PutoutFare][money]NULL,
[PlanPreFare][money]NULL,
[PutoutPreFare][money]NULL
)--Account表生成脚本
*/


select identity ( int , 1 , 1 ) as [ id ] , * into # from account order by [ month ] asc

CREATE TABLE # Temp (
[ id ] [ int ] NOT NULL ,
[ Month ] [ datetime ] NOT NULL ,
[ PlanFare ] [ money ] NULL ,
[ PutoutFare ] [ money ] NULL ,
[ PlanPreFare ] [ money ] NULL ,
[ PutoutPreFare ] [ money ] NULL
)

declare @id int
declare m cursor for select [ id ] from # order by [ id ] asc
open m
fetch next from m into @id
while ( @@fetch_status = 0 )
begin
insert into # Temp ( [ id ] , [ Month ] ,PlanFare,PutoutFare,PlanPreFare,PutoutPreFare)
select [ id ] , [ Month ] ,PlanFare,PutoutFare,PlanPreFare,PutoutPreFare from # where [ id ] = @id

UPDATE #
SET #.PlanPreFare = (a.PlanFare - a.putoutFare) + (a.PlanPreFare - a.putoutPreFare)
FROM # Temp AS a
WHERE #. [ id ] = a. [ id ] + 1
-- 前行作依据,后行来修改(此次的后行,变成下次的前行,依此循环,直至表中的行遍历结束)
truncate table # Temp
fetch next from m into @id
end
close m
deallocate m


UPDATE Account
SET Account.PlanPreFare = a.PlanPreFare
FROM # AS a
WHERE Account. [ Month ] = a. [ Month ]


drop table #
drop table # Temp


你可能感兴趣的:(脚本)