web-dev-qa-db-ja.com

リセット後の積算合計の計算

顧客ID、金額、およびリセット列を含むSQL Server 2012テーブルがあります。積算合計とリセット後の積算合計を計算しようとしています。リセット "フラグ"が設定されたら、積算合計の後に積算合計を計算します。

enter image description here

私は次のコードを持っていますが、ブレークポイント後の合計を計算する方法があるかどうかはわかりません。

WITH a
AS
(SELECT
        *
        ,SUM(amount) OVER (ORDER BY id) AS RunningTotal
    FROM Table1)
SELECT
    *
    ,CASE
        WHEN resetYN = 1 THEN 0
        ELSE Amount + LAG(RunningTotal, 1) OVER (ORDER BY id)
    END AS ResetRunningTotal
FROM a
1
user20907

リセット後に積算合計を取得する1つの方法を次に示します。おそらく他にもそこにいるでしょう。これがあなたのテストデータです:

CREATE TABLE user20907 (
ID INTEGER NULL,
CUSTOMERID INTEGER NULL,
AMOUNT INTEGER NULL,
RESETYN INTEGER NULL
);

BEGIN TRANSACTION;
INSERT INTO user20907 VALUES (1,111,5,0);
INSERT INTO user20907 VALUES (2,111,6,0);
INSERT INTO user20907 VALUES (3,111,7,1);
INSERT INTO user20907 VALUES (4,111,8,0);
INSERT INTO user20907 VALUES (5,111,9,0);
INSERT INTO user20907 VALUES (6,111,4,1);
INSERT INTO user20907 VALUES (7,111,7,0);
INSERT INTO user20907 VALUES (8,111,9,0);
COMMIT TRANSACTION;

まず、ResetYN列の累計を取得します。 SUM_OF_RESETYNと呼びます。外部クエリでは、CustomerIDSUM_OF_RESETYNの両方で分割できます。リセット実行合計の場合、Amountを直接取得する代わりに、既存のものと同様のケースステートメントを実行できます。

SELECT
      t.ID
    , CUSTOMERID
    , AMOUNT
    , RESETYN
    , RUNNINGTOTAL
    , SUM(CASE WHEN RESETYN = 1 THEN 0 ELSE AMOUNT END) OVER (PARTITION BY CUSTOMERID, SUM_OF_RESETYN ORDER BY ID) RESETRUNNINGTOTAL
FROM
(
    SELECT
          ID
        , CUSTOMERID
        , AMOUNT
        , RESETYN
        , SUM(AMOUNT) OVER (PARTITION BY CUSTOMERID ORDER BY ID) RUNNINGTOTAL
        , SUM(RESETYN) OVER (PARTITION BY CUSTOMERID ORDER BY ID) SUM_OF_RESETYN
    FROM user20907
) t;

そのクエリを実行しましたが、RESETRUNNINGTOTALIDにNULL値がなかった以外は、結果はあなたのクエリと一致しました。それは意図的なものでしたか?そうであれば、そのロジックをクエリに簡単に統合できます。

4
Joe Obbish