顧客ID、金額、およびリセット列を含むSQL Server 2012テーブルがあります。積算合計とリセット後の積算合計を計算しようとしています。リセット "フラグ"が設定されたら、積算合計の後に積算合計を計算します。
私は次のコードを持っていますが、ブレークポイント後の合計を計算する方法があるかどうかはわかりません。
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つの方法を次に示します。おそらく他にもそこにいるでしょう。これがあなたのテストデータです:
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
と呼びます。外部クエリでは、CustomerID
とSUM_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;
そのクエリを実行しましたが、RESETRUNNINGTOTAL
のID
にNULL値がなかった以外は、結果はあなたのクエリと一致しました。それは意図的なものでしたか?そうであれば、そのロジックをクエリに簡単に統合できます。