2016-03-02 60 views
0

继我从昨天最初提出的问题(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 

哪产生了下面的结果。

enter image description here

但是试图通过使它@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实现呢?

针对低于这个答案是结果集我得到:

enter image description here

编辑 修订查询以适应发票和付款:

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 

将会产生如下:

enter image description here

回答

2

您可以使用SUM像这样的OVER条款:

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 
+0

Zohar的,谢谢你的回答,我没有了以前让我学到新的东西碰到过,总是好的!我跑了你的两条建议,并附上结果的屏幕截图到我的问题。首先,最终的结果几乎是正确的(这是一分钱,但是会在某个地方凑到一起),但为什么平衡不会在每条线上增加?其次,是否可以将相同的逻辑应用于余额显示按付款额减少的付款? –

+0

我是一个白痴,它在一天结束时总结,是完美的,只需要尝试付款方面。 –

+0

我刚刚注意到日期不是唯一的。我想你应该在查询和'over'子句中将'incodeNumber'添加到order by子句。看到我编辑的答案。 –