在SQL Server 2012中运行平衡

时间:2013-08-15 19:38:57

标签: sql sql-server-2012 running-total

我正在尝试使用SQL Server 2012获得运行余额

这是我到目前为止所得到的......

DECLARE @Transactions TABLE
(
    Amount decimal (18,2),
    TransactionId uniqueidentifier,
    AccountId uniqueidentifier,
    TransactionDate date
)

DECLARE @AccountId uniqueidentifier = NEWID()

INSERT INTO @Transactions (Amount, TransactionId, AccountId, TransactionDate)
SELECT 3224.99, NEWID(), @AccountId, '2013-06-02'

INSERT INTO @Transactions (Amount, TransactionId, AccountId, TransactionDate)
SELECT 18.99, NEWID(), NEWID(), '2013-06-14'

INSERT INTO @Transactions (Amount, TransactionId, AccountId, TransactionDate)
SELECT -8.99, NEWID(), @AccountId, '2013-06-14' 

INSERT INTO @Transactions (Amount, TransactionId, AccountId, TransactionDate)
SELECT -6.99, NEWID(), @AccountId, '2013-06-14'

INSERT INTO @Transactions (Amount, TransactionId, AccountId, TransactionDate)
SELECT -22.14, NEWID(), @AccountId, '2014-11-09'

INSERT INTO @Transactions (Amount, TransactionId, AccountId, TransactionDate)
SELECT -84.99, NEWID(), @AccountId, '2013-06-09'


SELECT  SUM(Amount) OVER (ORDER BY TransactionDate, TransactionId) as [RunningBalance],
        Amount
FROM @Transactions 
WHERE AccountId = @AccountId
ORDER BY TransactionDate DESC

结果

RunningBalance                          Amount
--------------------------------------- ---------------------------------------
3101.88                                 -22.14
3133.01                                 -6.99
3124.02                                 -8.99
3140.00                                 -84.99
3224.99                                 3224.99

我的目标是让RunningBalance显示每个余额,即使它在同一天,每一行都应该有自己的余额

正如你所看到的,第二行没有正确显示,我相信这是因为我还有一个与之相冲突的第二个帐户ID,但假设WHERE语句会将其删除..

我可以删除ORDER BY,但是我首先想要我的列表最新事务,因为最终查询将有分页,我尝试过这样的事情......但是平衡已经关闭......

SELECT * FROM (
SELECT  SUM(Amount) OVER (PARTITION BY AccountId ORDER BY TransactionDate, TransactionId) as [RunningBalance],
        Amount, TransactionDate
FROM @Transactions 
WHERE AccountId = @AccountId
) AS Results
ORDER BY TransactionDate DESC




RunningBalance                          Amount                                  TransactionDate
--------------------------------------- --------------------------------------- ---------------
3101.88                                 -22.14                                  2014-11-09
3131.01                                 -8.99                                   2013-06-14
3124.02                                 -6.99                                   2013-06-14
3140.00                                 -84.99                                  2013-06-09
3224.99                                 3224.99                                 2013-06-02

我不太确定问题是什么......

3 个答案:

答案 0 :(得分:2)

不是通过TransactionId排序(与插入行时无关的无意义GUID值),而是需要以其他方式确定正确的顺序。由于您有一个CreatedOn列,用于存储插入行的日期/时间,因此您应该将其添加到订单中以生成正确的序列。

答案 1 :(得分:0)

您订购的运行余额与结果不同,因此行数与您认为的不一致:

SELECT  SUM(Amount) OVER (ORDER BY TransactionDate, TransactionId) as [RunningBalance],
        Amount
FROM @Transactions 
WHERE AccountId = @AccountId
ORDER BY TransactionDate, TransactionId

如果您想要ORDER BY TransactionDate DESC,请在运行余额中执行此操作:

SELECT  SUM(Amount) OVER (ORDER BY TransactionDate DESC, TransactionId) as [RunningBalance],
        Amount
FROM @Transactions 
WHERE AccountId = @AccountId

使用不同的ORDER BY条件,您无法获得有意义的运行余额。

答案 2 :(得分:0)

我认为你需要使用的是ROWS UNBOUNDED PRECEDING。

SELECT TransactionDate
,Amount
,SUM(Amount) OVER (
    ORDER BY TransactionDate DESC ROWS UNBOUNDED PRECEDING
    ) AS [RunningBalance]
FROM @Transactions
WHERE AccountId = @AccountId