sql - 如何对之前的行求和以在 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
我需要对每一行的前一次付款进行汇总。
谢谢!
解决方案
这样的事情会有所帮助
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
推荐阅读
- r - 如何修复 GAMLSS 回归中未找到的 glim.fit 'fit'中的错误
- python-3.x - 为什么进程终止时没有 process.join() 返回?
- flutter - 颤动网格视图值不更新
- python - 调用 destroy() 后 GTK 窗口不消失
- javascript - 变量已定义,但仍未定义错误
- gwt - GWT com.google.gwt.json.client.* JSON 类不支持 jsinterop?
- sql-server - 自动将数据从 CSV 添加到 SQL Server
- protractor - 如何获取行号,这样行应该包含量角器中的特定文本
- react-native - onNavigationStateChange 不适用于我在 Angular 中的 WebView URL
- c++ - 在函数中分配指向数组的指针