TSQL 根据工作日得到 运行 总数

TSQL to get running total according to work days

我想要所有工作日的总计付款额加上运行 非工作日的付款总额。例如,我有以下 table 每个月每天的付款金额。

create table #payment_amounts
(
ReceivedDate date
,PaymentAmount decimal(13,2)
,PostingDay int
)

insert #payment_amounts values('2/1/15',100000.00,0)
insert #payment_amounts values('2/2/15',200000.00,1)
insert #payment_amounts values('2/3/15',300000.00,1)
insert #payment_amounts values('2/4/15',400000.00,1)
insert #payment_amounts values('2/5/15',500000.00,1)
insert #payment_amounts values('2/6/15',100000.00,1)
insert #payment_amounts values('2/7/15',200000.00,1)
insert #payment_amounts values('2/8/15',300000.00,0)
insert #payment_amounts values('2/9/15',400000.00,0)
insert #payment_amounts values('2/10/15',500000.00,1)

输出如下:

ReceivedDate    PaymentAmount   PostingDay
2015-02-01  100000.00   0
2015-02-02  200000.00   1
2015-02-03  300000.00   1
2015-02-04  400000.00   1
2015-02-05  500000.00   1
2015-02-06  100000.00   1
2015-02-07  200000.00   1
2015-02-08  300000.00   0
2015-02-09  400000.00   0
2015-02-10  500000.00   1

所以我想要的是只有 PostingDay = 1 的行的 PaymentAmount 值。但是如果之前的日期是 PostingDay = 0,那么我想要这些 PaymentAmounts 的总和。所以根据上面的数据,我希望它看起来像下面这样:

ReceivedDate    PaymentAmount   PostingDay  RunningTotal
2/1/2015     100,000.00      -       -   
2/2/2015     200,000.00      1   300,000.00 
2/3/2015     300,000.00      1   300,000.00 
2/4/2015     400,000.00      1   400,000.00 
2/5/2015     500,000.00      1   500,000.00 
2/6/2015     100,000.00      1   100,000.00 
2/7/2015     200,000.00      1   200,000.00 
2/8/2015     300,000.00      -       -   
2/9/2015     400,000.00      -       -   
2/10/2015    500,000.00      1   1,200,000.00 

我该怎么做?

有点 head-scratcher,但试试这个:

;with cte1 as (
    Select A.*
          ,LagGrp = Lag(Grp,1) over (Order by ReceivedDate)
     From (
            Select *
                  ,Grp = IIF(PostingDay=1,null,Row_Number() over (Order By ReceivedDate) - Row_Number() over (Partition By PostingDay Order By ReceivedDate))
            From  #payment_amounts
          ) A
)
Select A.ReceivedDate
      ,A.PaymentAmount
      ,A.PostingDay  
      ,RunningTotal  = (PaymentAmount + IsNull((Select sum(PaymentAmount) From cte1 Where Grp=A.LagGrp),0)) * PostingDay
 from  cte1 A      
 Order By 1

Returns

我想通了!对于遇到此问题的其他人,这是我的解决方案:

;with mycte as (
select * , Sum(PostingDay) Over(Order by ReceivedDate desc)  grp from #payment_amounts
)

Select ReceivedDate,    PaymentAmount,  PostingDay  
, Case when PostingDay=0 then null else sum(PaymentAmount) Over(Partition by grp  Order by  ReceivedDate ) End RunningTotal from mycte 
order by ReceivedDate

drop table #payment_amounts