2017-02-01 3 views
1

나는 지불 모든 근무일에 대한 금액을 더한 비 근무일에서 지불 금액의 총을 실행하고 원하는 작업 전체에있어서 실행 얻을 수 있습니다. 예를 들어, 나는 달 당 지불 금액이 아래 표에 있습니다. TSQL은 일

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 

어떻게하면됩니까?

답변

2

머리 - 아마추어의 비트,하지만이 시도 제공 :

;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 

반환

enter image description here

1

나는 이것을 생각을! 이 문제가있는 다른 사람들은 다음과 같습니다.

;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 
+0

당신의 해결책은 간단합니다. 내 대답을 선택할 필요가 없습니다. –