[英]How to calculate balance in SQL Server?
我有一個查詢結果是
Code id Date Amount Paid Balance
------------------------------------------------------
INV-000001 0 10/25/2019 50000 420 0
INV-000001 0 10/25/2019 50000 90 0
INV-000001 0 10/25/2019 50000 100 0
INV-000002 0 10/30/2019 25000 0 0
INV-000003 0 10/30/2019 25000 0 0
INV-000004 0 10/30/2019 25000 0 0
我想用 SQL 計算余額。 例如,
在第一行,金額是 50000,支付 420 所以余額是 49580。在第二行余額將是 50000 - 90 -(第一行余額 420)= 49490
SELECT p.Code
,p.DATE
,p.STATUS
,'' AS Customer
,InvoiceAmount
,ISNULL(Paid, 0) AS Paid
,0 AS balance
FROM purchaseinvmaster p
LEFT OUTER JOIN InvoiceVoucherMap i ON i.InvoiceId = p.id
LEFT OUTER JOIN debitcreditmaster d ON i.VoucherId = d.id
您沒有提及您使用的是哪個數據庫,但您可以使用標准窗口函數來計算余額。 例如:
select
*,
amount - sum(paid) over(order by date) as balance
from t
SELECT p.Code,
InvoiceAmount , ISNULL(Paid,0) as Paid,
InvoiceAmount - SUM(ISNULL(Paid,0)) OVER (ORDER BY p.id ROWS UNBOUNDED PRECEDING) AS Balance
from purchaseinvmaster p
基於基本查詢中的ISNULL()
,我假設您正在使用 SQL Server,但這應該可以在大多數主要平台上進行細微調整。
我進一步假設DATE
列只是一個日期,而不是日期時間。 這意味着我們需要對發生在同一日期的交易施加訂單。 為此,我采用了您的基本查詢並將其包裝在公共表表達式 (CTE) 中,並向結果添加了一個簡單的ROW-NUMBER()
。 你的一個表可能有一列建議更好的順序,但沒有一個,這也行。 它使用子句ORDER BY (SELECT 0)
因為窗口函數需要一個 order by,但我們沒有要引用的排序列。
之后,在主查詢中,使用窗口SUM
來獲取您的運行總付款。
WITH cte AS
(
SELECT
p.Code
,p.DATE
,p.STATUS
,'' AS Customer
,InvoiceAmount
,ISNULL(Paid, 0) AS Paid
,ROW_NUMBER() OVER (PARTITION BY p.Code ORDER BY (SELECT 0)) AS OrdinalNbr
FROM purchaseinvmaster p
LEFT OUTER JOIN InvoiceVoucherMap i
ON i.InvoiceId = p.id
LEFT OUTER JOIN debitcreditmaster d
ON i.VoucherId = d.id
)
SELECT
Code
,DATE
,STATUS
,Customer
,InvoiceAmount
,Paid
,Balance = InvoiceAmount - (SUM(Paid) OVER (PARTITION BY Code ORDER BY OrdinalNbr))
FROM
cte;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.