考虑以下数据:
DECLARE @TBL TABLE (RecordID BIGINT,
ID BIGINT,
RowNumber BIGINT,
Amount NUMERIC(6, 2),
Balance NUMERIC (6, 2)
)
INSERT INTO @TBL VALUES (99, 1, 1, 10, 20)
INSERT INTO @TBL VALUES (100, 3, 1, 5, 20)
INSERT INTO @TBL VALUES (101, 1, 2, 5, 20)
INSERT INTO @TBL VALUES (102, 1, 3, 10, 20)
INSERT INTO @TBL VALUES (100, 3, 2, 50, 20)
SELECT * FROM @TBL
假设在这种情况下我们有一个包含这些数据的表,我想要做的就是在每个ID中,对于每个行号递增,减去余额的金额。因此,我对平衡列的预期输出应分别为:
10
15
5
-5
-35
我的问题是,是否有任何方法可以使用CTE而不是游标来实现这一结果?
抱歉,我没有发布任何图片(他们更好地展示了我想要完成的任务,但论坛不允许这样做,因为我的声誉是< 10)。
答案 0 :(得分:0)
我想我明白你想要什么,是的:递归CTE可以为你做到。
;with CTE
as (
select RecordID, ID, RowNumber, Amount, cast(Balance - Amount as numeric(6,2)) 'Balance'
from @TBL as Anchor
where rownumber = 1
union all
select tbl.RecordID, tbl.ID, tbl.RowNumber, tbl.Amount, cast(cte.balance - tbl.amount as numeric(6,2)) 'Balance'
from @TBL tbl
join CTE
on CTE.ID = tbl.ID
and CTE.RowNumber = tbl.Rownumber - 1
)
select * from CTE
order by RecordID asc
产地:
RecordID ID RowNumber Amount Balance
99 1 1 10.00 10.00
100 3 1 5.00 15.00
100 3 2 50.00 -35.00
101 1 2 5.00 5.00
102 1 3 10.00 -5.00