Reset Running Total based on another column Reset Running Total based on another column sql sql

Reset Running Total based on another column


Try flag previous row

WITH cte     AS (SELECT id,                val,                reset_val,                val AS running_total,                CASE WHEN val > reset_val THEN 1 ELSE 0 END as flag         FROM   #reset_runn_total         WHERE  id = 1         UNION ALL         SELECT r.*,                CASE c.flag                  WHEN 1 then r.val                  ELSE c.running_total + r.val                END,                CASE WHEN CASE c.flag                      WHEN 1 then r.val                      ELSE c.running_total + r.val                    END > r.reset_val                     THEN 1 ELSE 0 END         FROM   cte c                JOIN #reset_runn_total r                  ON r.id = c.id + 1)SELECT *FROM   cte 


You can try using a quirky update like this

--- setupIF OBJECT_ID('tempdb..#reset_runn_total') IS NOT NULL DROP TABLE #reset_runn_totalcreate table #reset_runn_total(id int identity(1,1) PRIMARY KEY, val int, reset_val int, running_sum int)insert into #reset_runn_total(val, reset_val) values (1,10),(8,12),(6,14),(5,10),(6,13),(3,11),(9,8),(10,12)--- use quirky updateDECLARE     @running_sum    INT            , @temp         INTUPDATE      #reset_runn_totalSET         @temp = running_sum = COALESCE(@running_sum, 0) + val            , @running_sum = CASE WHEN @temp < reset_val THEN @temp ELSE 0 ENDOPTION      (FORCE ORDER)--- dump resultSELECT * FROM #reset_runn_total

Note that CLUSTERED INDEX on the temp table is required (PK's default type) for OPTION (FORCE ORDER) to make sense.