T-SQL:使用CTE对值进行分组

时间:2015-08-24 17:20:14

标签: sql sql-server common-table-expression

考虑以下数据:

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)。

1 个答案:

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