重置后计算运行总计

use*_*907 2 sql-server running-totals

我有一个 SQL Server 2012 表,其中包含客户 ID、金额和重置列。I\xe2\x80\x99m 尝试计算运行总计并计算重置后的运行总计。一旦设置了重置“标志”,我想在运行总计之后计算运行总计。

\n\n

在此输入图像描述

\n\n

我有以下代码,不确定是否有办法计算断点后的运行总计。

\n\n
WITH a\nAS\n(SELECT\n        *\n        ,SUM(amount) OVER (ORDER BY id) AS RunningTotal\n    FROM Table1)\nSELECT\n    *\n    ,CASE\n        WHEN resetYN = 1 THEN 0\n        ELSE Amount + LAG(RunningTotal, 1) OVER (ORDER BY id)\n    END AS ResetRunningTotal\nFROM a\n
Run Code Online (Sandbox Code Playgroud)\n

Joe*_*ish 5

这是重置后获取运行总计的一种方法。那里可能还有其他人。这是您的测试数据:

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;
Run Code Online (Sandbox Code Playgroud)

首先获取该列的运行总计ResetYN。我要调用它SUM_OF_RESETYN。在外部查询中,您可以同时按CustomerID和进行分区SUM_OF_RESETYN。对于重置运行总计,Amount您可以执行类似于已有内容的 case 语句,而不是直接获取:

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;
Run Code Online (Sandbox Code Playgroud)

我运行了该查询,结果与您的结果匹配,只是我没有 1 的 NULL 值。RESETRUNNINGTOTALID是故意的吗?如果是这样,那么将这一点逻辑集成到我的查询中应该很容易。