查询以在SQL Server中查找“每次支付相应的账单后的余额”

时间:2018-06-21 16:21:41

标签: sql-server

PaymentID  SupplyInvoiceID   Date     TotalBill   BillPaidAmount    Remaining Bill

1           1              05-04-2018   2,10,000    20,000             1,90,000
2           1              10-05-2018   2,10,000    60,000             1,30,000
3           1              13-06-2018   2,10,000    1,30,000           0 
4           2              10-05-2018   80,000      40,000             40,000
5           2              13-06-2018   80,000      20,000             20,000
6           2              13-06-2018   80,000      20,000             0   

每张帐单的付款在不同的日期分期付款,如上所示。每次支付部分账单时如何查找剩余的账单金额?

我使用了以下查询:

SELECT siph.SupplyPaymentID,si.SupplyInvoiceID, 
       siph.DateOfPayment,si.TotalBill, siph.BillPaidAmount,
       si.TotalBill - SUM(siph.BillPaidAmount) over(order by siph.SupplyPaymentID asc) as RemainingBillAmount,
       siph.PaymentMode 
from SupplyInvoicePaymentHistory siph inner join 
     SupplyInvoice si 
     on siph.SupplyInvoiceID = si.SupplyInvoiceID 

但是它仅适用于第一个SupplyInvoiceID的账单付款。输入第二个及以后的SupplyInvoiceID的帐单付款时,我得到以下错误结果:

 PaymentID  SupplyInvoiceID   Date     TotalBill   BillPaidAmount    Remaining Bill

    1           1              05-04-2018   2,10,000    20,000             1,90,000
    2           1              10-05-2018   2,10,000    60,000             1,30,000
    3           1              13-06-2018   2,10,000    1,30,000           0 
    4           2              10-05-2018   80,000      40,000             -1,70,000
    5           2              13-06-2018   80,000      20,000             -1,90,000  
    6           2              15-06-2018   80,000      20,000             -2,10,000  

..请帮助找到上述问题第一段中列出的正确结果。

1 个答案:

答案 0 :(得分:1)

您需要在PARTITION BY中添加sum() over ()子句,以使其成为每个发票ID的累积金额。

将此添加到您的RemainingBillAmount列:

... - SUM(...) over (partition by si.SupplyInvoiceID ...)

整个查询:

SELECT siph.SupplyPaymentID,si.SupplyInvoiceID, 
       siph.DateOfPayment,si.TotalBill, siph.BillPaidAmount,
       si.TotalBill - SUM(siph.BillPaidAmount) over(partition by si.SupplyInvoiceID order by siph.SupplyPaymentID asc) as RemainingBillAmount,
       siph.PaymentMode 
from SupplyInvoicePaymentHistory siph inner join 
     SupplyInvoice si 
     on siph.SupplyInvoiceID = si.SupplyInvoiceID