ROWS
SQL-Server 2012 では、新しく追加されたorRANGE
句を使用できます。
SELECT
ID, debit, credit,
sum_debit =
SUM(debit - credit)
OVER (ORDER BY ID
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
)
FROM
CreditData
ORDER BY
ID ;
SQLフィドルでテスト済み
そこで使用するだけOVER(ORDER BY ID)
で、結果は同じになります。ただし、デフォルトが使用されます。これはRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
、効率の違いがあります (ROWS
実行中の合計で優先する必要があります)。
@Aaron Bertrandによる優れた記事があります。これには、実行中の合計を計算するためのさまざまな方法の徹底的なテストが含まれています。
以前のバージョンの SQL-Server では、自己結合、再帰 CTE、カーソルなど、他の方法を使用する必要があります。これは、Aaron のブログから盲目的にコピーされたカーソル ソリューションで、テーブルと列が問題に合わせて調整されています。
DECLARE @cd TABLE
( [ID] int PRIMARY KEY,
[debit] int,
[credit] int,
[sum_debit] int
);
DECLARE
@ID INT,
@debit INT,
@credit INT,
@RunningTotal INT = 0 ;
DECLARE c CURSOR
LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR
SELECT ID, debit, credit
FROM CreditData
ORDER BY ID ;
OPEN c ;
FETCH NEXT FROM c INTO @ID, @debit, @credit ;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @RunningTotal = @RunningTotal + (@debit - @credit) ;
INSERT @cd (ID, debit, credit, sum_debit )
SELECT @ID, @debit, @credit, @RunningTotal ;
FETCH NEXT FROM c INTO @ID, @debit, @credit ;
END
CLOSE c;
DEALLOCATE c;
SELECT ID, debit, credit, sum_debit
FROM @cd
ORDER BY ID ;
SQL-Fiddle-cursorでテスト済み