T-SQL:使用 CTE 对值进行分组
T-SQL: group values with CTE
考虑以下数据:
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
假设在这种情况下我们有一个 table 这个数据,我想做的是在每个 ID 内,对于每个升序的行号减去余额的金额。所以,我对 balance 列的预期输出应该分别是:
10
15
5
-5
-35
我的问题是是否有任何方法可以使用 CTE 而不是游标来实现此结果?
抱歉,我没有 post 任何图片(它们更好地展示了我想要完成的事情,但论坛不允许,因为我的声誉 < 10)。
我想我明白你想要什么,是的:递归 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
考虑以下数据:
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
假设在这种情况下我们有一个 table 这个数据,我想做的是在每个 ID 内,对于每个升序的行号减去余额的金额。所以,我对 balance 列的预期输出应该分别是:
10
15
5
-5
-35
我的问题是是否有任何方法可以使用 CTE 而不是游标来实现此结果?
抱歉,我没有 post 任何图片(它们更好地展示了我想要完成的事情,但论坛不允许,因为我的声誉 < 10)。
我想我明白你想要什么,是的:递归 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