如何获取此查询中的实际运行余额
问题描述:
继我从昨天最初提出的问题(here)后,我能够构建下面的SQL查询,该查询生成了运行的发票和付款清单。如何获取此查询中的实际运行余额
SELECT
'Invoice' AS TransactionType,
i.InvoiceNumber AS Description,
i.InvoiceDate AS TransactionDate,
CAST(ROUND(i.OutstandingBalance, 2) AS DECIMAL(12, 2)) AS TransactionAmount
FROM
Invoices i
WHERE
i.CustomerId = 12
AND i.InvoiceDate BETWEEN '20150601' AND '20160229'
AND i.OutstandingBalance > 0.02
UNION
SELECT
'Payment' AS TransactionType,
ip.InvoicePaymentId AS Description,
ip.InvoicePaymentDate AS TransactionDate,
- ip.Amount AS TransactionAmount
FROM
InvoicePayments ip
WHERE
ip.CustomerId = 12
AND ip.InvoicePaymentDate BETWEEN '20150601' AND '20160229'
ORDER BY
TransactionDate
我现在想要做的是产生一个额外的列,它实际上是帐户上的运行余额。我想,如果我开始使用一个变量,那么应该可以添加(或从中减去给我的东西)。为此,我尝试了以下内容;
DECLARE @OutstandingBalance MONEY = 0
SELECT
'Invoice' AS TransactionType, i.InvoiceNumber AS Description,
i.InvoiceDate AS TransactionDate,
CAST(ROUND(i.OutstandingBalance, 2) AS DECIMAL(12, 2)) AS TransactionAmount,
@OutstandingBalance + CAST(ROUND(i.OutstandingBalance, 2) AS DECIMAL(12, 2)) AS Balance
FROM
Invoices i
WHERE
i.CustomerId = 12
AND i.InvoiceDate BETWEEN '20150601' AND '20160229'
AND i.OutstandingBalance > 0.02
哪产生了下面的结果。
但是试图通过使它@OutstandingBalance + =像这样修改的查询;
DECLARE @OutstandingBalance MONEY = 0
SELECT
'Invoice' AS TransactionType, i.InvoiceNumber AS Description,
i.InvoiceDate AS TransactionDate,
CAST(ROUND(i.OutstandingBalance, 2) AS DECIMAL(12, 2)) AS TransactionAmount,
@OutstandingBalance += CAST(ROUND(i.OutstandingBalance, 2)AS DECIMAL(12,2)) AS Balance
FROM
Invoices i
WHERE
i.CustomerId = 12
AND i.InvoiceDate BETWEEN '20150601' AND '20160229'
AND i.OutstandingBalance > 0.02
抛出一个错误告诉我,语法附近关键字AS(这我相信所指的平衡不正确。我怀疑,我应该是“设置”的@OutstandingBalance
价值,但加入中的一组语句选择也会引发错误。
是否有可能在这种查询的创建运行平衡,如果是一个人如何适应设置@OutstandingBalance
实现呢?
针对低于这个答案是结果集我得到:
编辑 修订查询以适应发票和付款:
SELECT 'Invoice' AS TransactionType,
i.InvoiceNumber AS Description,
i.InvoiceDate AS TransactionDate,
CAST(ROUND(i.OutstandingBalance,2)AS DECIMAL(12,2)) AS TransactionAmount ,
SUM(CAST(ROUND(i.OutstandingBalance,2)AS DECIMAL(12,2))) OVER(ORDER BY i.InvoiceDate, i.InvoiceNumber) AS Balance
FROM Invoices i
WHERE i.CustomerId = 12
AND i.InvoiceDate BETWEEN '20150601' AND '20160229'
AND i.OutstandingBalance > 0.02
UNION
SELECT
'Payment' AS TransactionType,
ip.InvoicePaymentId AS Description,
ip.InvoicePaymentDate AS TransactionDate,
- ip.Amount AS TransactionAmount,
SUM(CAST(ROUND(-ip.Amount,2) AS DECIMAL(12,2))) OVER(ORDER BY ip.InvoicePaymentDate,ip.InvoicePaymentId) AS Balance
FROM InvoicePayments ip
WHERE ip.CustomerId = 12
AND ip.InvoicePaymentDate BETWEEN '20150601' AND '20160229'
ORDER BY TransactionDate, Description
将会产生如下:
答
SELECT 'Invoice' AS TransactionType,
i.InvoiceNumber AS Description,
i.InvoiceDate AS TransactionDate,
CAST(ROUND(i.OutstandingBalance,2)AS DECIMAL(12,2)) AS TransactionAmount ,
SUM(CAST(ROUND(i.OutstandingBalance,2)AS DECIMAL(12,2))) OVER(ORDER BY i.InvoiceDate, i.InvoiceNumber) AS Balance
FROM Invoices i
WHERE i.CustomerId = 12
AND i.InvoiceDate BETWEEN '20150601' AND '20160229'
AND i.OutstandingBalance > 0.02
ORDER BY TransactionDate, Description
你也可以使用一个CTE来保存一个投:
;WITH cte AS
(
SELECT 'Invoice' AS TransactionType,
i.InvoiceNumber AS Description,
i.InvoiceDate AS TransactionDate,
CAST(ROUND(i.OutstandingBalance,2)AS DECIMAL(12,2)) AS TransactionAmount
FROM Invoices i
WHERE i.CustomerId = 12
AND i.InvoiceDate BETWEEN '20150601' AND '20160229'
AND i.OutstandingBalance > 0.02
)
SELECT TransactionType,
Description,
TransactionDate,
TransactionAmount,
SUM(TransactionAmount) OVER(ORDER BY TransactionDate, Description) AS Balance
FROM cte
ORDER BY TransactionDate, Description
Zohar的,谢谢你的回答,我没有了以前让我学到新的东西碰到过,总是好的!我跑了你的两条建议,并附上结果的屏幕截图到我的问题。首先,最终的结果几乎是正确的(这是一分钱,但是会在某个地方凑到一起),但为什么平衡不会在每条线上增加?其次,是否可以将相同的逻辑应用于余额显示按付款额减少的付款? –
我是一个白痴,它在一天结束时总结,是完美的,只需要尝试付款方面。 –
我刚刚注意到日期不是唯一的。我想你应该在查询和'over'子句中将'incodeNumber'添加到order by子句。看到我编辑的答案。 –