1
ID      debit   credit  sum_debit
---------------------------------
1       150     0       150
2       100     0       250
3       0       50      200
4       0       100     100
5       50      0       150

私はこのテーブルを持っています。私の問題は、前の行から借方を差し引いた貸方 ( )sum_debitの合計である列を取得する方法です。新しい行ごとに借方を入力しますが、貸方データはゼロです。または、貸方と借方の値を入力するとゼロになります。どうすれば入手できますか?sum_debitsum_debit = sum_debit + debit - creditsum_debit

4

2 に答える 2

4

ROWSSQL-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でテスト済み

于 2013-06-11T18:21:35.547 に答える
2

「have」がデータ テーブルであると仮定すると、これは ANSI SQL ソリューションである必要があります。

select h.*, sum(i.debit) as debsum, sum(i.credit) as credsum, sum(i.debit) - sum(i.credit) as rolling_sum
from have h inner join have i
on h.id >= i.id
group by h.id, h.debit, h.credit
order by h.id

一般に、解決策は、行をその行の前にあるすべての行に結合し、それらの行の合計を抽出してから、すべてをグループ化して、期待どおりに 1 つの行に戻すことです。たとえば、この質問のように。

于 2013-06-11T18:21:28.980 に答える