/ /同じ列のフィールドを減算して間隔を取得します-sql-server、sql-server-2005、tsql、sql-server-2008

間隔を取得するために同じ列のフィールドを減算する - sql-server、sql-server-2005、tsql、sql-server-2008

テーブル「@ 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つである可能性があります。カーソルとテーブル変数を使用して作成するのは比較的簡単です。