SQL Server - Cumulative Sum that resets when 0 is encountered

后端 未结 1 1921
面向向阳花
面向向阳花 2021-01-06 07:27

I would like to do a cumulative sum on a column, but reset the aggregated value whenever a 0 is encountered

Here is an example of what i try to do :

This d

相关标签:
1条回答
  • 2021-01-06 08:03

    In SQL Server 2008, you are severely limited because you cannot use analytic functions. The following is not efficient, but it will solve your problem:

    with tg as (
          select t.*, g.grp
          from t cross apply
               (select count(*) as grp
                from t t2
                where t2.pk <= t.pk and t2.pk = 0
               ) g
         )
    select tg.*, p.running_price
    from tg cross apply
         (select sum(tg2.price) as running_price
          from tg tg2
          where tg2.grp = tg.grp and tg2.pk <= tg.pk
         ) p;
    

    Alas, prior to SQL Server 2012, the most efficient solution might involve cursors. In SQL Server 2012+, you simply do:

    select t.*,
           sum(price) over (partition by grp order by pk) as running_price
    from (select t.*,
                 sum(case when price = 0 then 1 else 0 end) over (order by pk) as grp
          from t
         ) t;
    
    0 讨论(0)
提交回复
热议问题