テーブル「@ table1」があります。「金額」列をBOTTOMからRowIDによるTOPの順序に再帰的に更新します。つまり、負の値からその値を上の行の値で減算します。それでも最終結果が負の場合は、その値を次の行で減算し、前の値を0に置き換えます。
DECLARE @table1 TABLE (RowID int, Amount int);
INSERT @table1 VALUES
(1,20),
(2,10),
(3,-10),
(4,10),
(5,-5),
(6,30);
Select * from @table1
RowID Amount
----------- -----------
1 20
2 10
3 -10
4 10
5 -5
6 30
結果表
DECLARE @table1 TABLE (RowID int, Amount int);
INSERT @table1 VALUES
(1,20),
(2,0),
(3,0),
(4,5),
(5,0),
(6,30);
Select * from @table1
RowID Amount
----------- -----------
1 20
2 0
3 0
4 5
5 0
6 30
回答:
回答№1は1これを(単一のクエリとして)実装することを考えることができる唯一の方法は、次のようなものを使用することです。 積算合計 。これは事実上、製品に参加することになります「左」テーブルの各行について、「右」テーブルに「その前に来る」すべてのレコードが含まれるように、テーブル自体を作成します。このようにして、更新されたフィールドの現在の合計を維持できます。残念ながら、書くのはかなり混乱し、ひどく実行します。
使用目的のシナリオによっては、これはカーソルがより適切な代替手段であるまれなケースの1つである可能性があります。カーソルとテーブル変数を使用して作成するのは比較的簡単です。