1

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 に各残高を表示させることです。同じ日であっても、各行には独自の残高が必要です。

ご覧のとおり、2 番目の行が正しく表示されません。競合する 2 番目のアカウント 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

何が問題なのかよくわかりません...

4

3 に答える 3

2

TransactionId (行がいつ挿入されたかには関係のない無意味な GUID 値) による順序付けの代わりに、別の方法で適切な順序を決定する必要があります。行が挿入された日付/時刻を格納する CreatedOn 列があるため、正しいシーケンスを生成するために、それを注文に追加する必要があります。

于 2013-08-15T20:31:31.257 に答える