2017-06-09 15 views
-1

Iは、与えられた形式のデータを有する:SQL Serverクエリでランニングバランスを計算する方法は?

Id | Total_Inv_Amount | Total_Rec_Inv_Amount | Invoice_No Invoice_Amont | Payment_Outstanding | Refund_Outstanding 
1 | 25000 | 22000 | 5 | 15000 | 0 | 0 
1 | 25000 | 22000 | 6 | 10000 | 0 | 0 
2 | 45000 | 48000 | 10| 25000 | 0 | 0 
2 | 45000 | 48000 | 15| 20000 | 0 | 0 

期待される結果を....

Id | Total_Inv_Amount | Total_Rec_Inv_Amount | Invoice_No Invoice_Amont | Payment_Outstanding | Refund_Outstanding 
1 | 25000 | 22000 | 5 | 15000 | 0  | 0 
1 | 25000 | 22000 | 6 | 10000 | 3000 | 0 
2 | 45000 | 48000 | 10| 25000 | 0  | 0 
2 | 45000 | 48000 | 15| 20000 | 0  | 2000 

計算: -
インボイスなし5 & 6の合計量です。 15000 + 10000 = 25000
合計受領額:22000

請求書Payment_Outstanding分野で今

Noが0
ためtotal_invoice_amt>請求書5量 22000> 15000抜群の支払いよりも0 は量が今22000から15000 = 7000

次の請求書からこの金額を差し引くあるままであります量は

10000から7000 = 3000万で、これはある卓越した支払い

今どのようにクエリでこれを計算するために私を助けてください

+0

期待される出力を追加できますか? –

+0

フィールドをチェックしてくださいPayment_Outstanding and Refund_Outstanding –

+0

これらのフィールドは値を計算する必要があります –

答えて

0

再帰クエリは実行中の値を取得するのに最適です。 最初のcteは、再帰部分によって使用されるrownumberを追加します。再帰的な部分で計算が行われます。最終結果では、0未満の値は表示されません。

Declare @myTable table (Id int, Total_Inv_Amount float, 
    Total_Rec_Inv_Amount float,Invoice_No int, 
    Invoice_Amount float, Payment_Outstanding float, 
    Refund_Outstanding float) 

insert into @myTable values 
(1 , 25000 , 22000 , 5 , 15000 , 0 , 0 ), 
(1 , 25000 , 22000 , 6 , 10000 , 0 , 0 ), 
(2 , 45000 , 48000 , 10, 25000 , 0 , 0 ), 
(2 , 45000 , 48000 , 15, 20000 , 0 , 0 ) 

;with first_cte as 
(
    select *, ROW_NUMBER() over (partition by id order by invoice_no) rn 
    from @myTable 
) 
, result_rte as 
(
    select m.Id, m.Total_Inv_Amount,m.Total_Rec_Inv_Amount, 
     m.Invoice_No, m.Invoice_Amount, m.Payment_Outstanding, 
     m.Refund_Outstanding, m.rn, invoice_Amount TotalAmount 
    from first_cte m 
    where rn = 1 
    union all 
    select m.Id, m.Total_Inv_Amount,m.Total_Rec_Inv_Amount, 
     m.Invoice_No, m.Invoice_Amount, 
     r.TotalAmount + m.Invoice_Amount - m.Total_Rec_Inv_Amount , 
     m.Total_Rec_Inv_Amount - (r.TotalAmount + m.Invoice_Amount), 
     m.rn, r.TotalAmount + m.Invoice_Amount 
    from result_rte r 
    join first_cte m on r.id = m.id and r.rn+1 = m.rn 
) 

select Id, Total_Inv_Amount,Total_Rec_Inv_Amount,Invoice_No, Invoice_Amount, 
    case when Payment_Outstanding > 0 then Payment_Outstanding else 0 end Payment_Outstanding , 
    case when Refund_Outstanding > 0 then Refund_Outstanding else 0 end Refund_Outstanding 
from result_rte order by invoice_no 
関連する問題