首页 > 解决方案 > 如何对之前的行求和以在 SQL Server 中找到平衡

问题描述

我正在开发一项服务,该服务需要根据总发票价值和客户已支付的部分付款来计算客户欠款。

因此,在 tableA 中,我有一行包含发票总值:

[dbo].[表A]

ID    CustomerId    InvoiceVal    
1     12            1000           
2     11            2000   
3     10            5000   
4     14            15000   
5     12            100   
6     16            8000   
7     18            3200

在表 B 中,我记录了每个客户对每张发票的部分付款:

[dbo].[表 B]

ID    InvoiceId    Payment
1     1            150   
2     3            50
3     1            120
4     1            100
5     5            90
6     4            7500

因此,如您所见,客户 12 有一张 1000 美元的发票,并支付了 3 次总金额为 370 美元的款项

我需要能够在每行中设置部分欠款,这是预期的结果:

No.    InoviceId    CustomerId    Payment    Owed
1      1            12            150        850
2      1            12            120        730
3      1            12            100        630

到目前为止,这是我的代码:

DECLARE @invid int = '1'

DECLARE @invoicetotal numeric(18,2)

SET @invoicetotal =
    (
        SELECT
            [dbo].[TableA].[InvoiceVal]
        FROM [dbo].[TableA]
        WHERE
            ([dbo].[TableA].[ID] = @invid)
    )

SELECT
    *,
    SUM(@invoicetotal - [dbo].[TableB].[Payment]) OVER(ORDER BY [dbo].[TableB].[ID] ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS [Owed]
FROM [dbo].[TableB]
WHERE
    ([dbo].[TableB].[InvoiceId] = @invid) 

但这就是我得到的:

ID    InvoiceId    Payment    Owed
1     1            150.00     NULL
3     1            120.00     850.00
4     1            100.00     1730.00

我需要对每一行的前一次付款进行汇总。

谢谢!

标签: sqlsql-serverselect

解决方案


这样的事情会有所帮助

SELECT 
  ROW_NUMBER() OVER (ORDER BY TableB.ID ASC) NO,
  CustomerId,
  Payment,
  InvoiceVal - SUM(Payment) OVER (PARTITION BY TableA.ID ORDER BY TableB.Id ASC) Owed
FROM TableA
INNER JOIN TableB
  ON TableA.Id = TableB.InvoiceId
WHERE 
  CustomerId = 12

工作小提琴


推荐阅读