2016-04-25 14 views
0

ユーザーID、日付時刻、トランザクションタイプ、および値を記録するユーザーのテーブルにトランザクションのリストがあります。 TransactionIDは、主キーの自動インクリメント1です。TransactionTypeは、すべての値がテーブル内で正の値になるように、Deposit(1)またはWithdrawal(2)を定義します。私は、実行中の合計で口座の記述を作成しようとしています。トランザクションからの勘定勘定SQL

TransactionID UserID DateTime   TransactionTypeID Value 
    1   3112  01-04-2016 12:00   1    5.00 
    3   3112  01-04-2016 13:00   2    2.00 
    5   3112  01-04-2016 13:25   2    1.00 
    8   3112  02-04-2016 12:00   1    10.00 
    9   3112  02-04-2016 12:35   2    4.00 

基本的に私が作成するために合計値を持つアカウントのクエリの実行中の文を作成したい:

DateTime   TransactionTypeID Deposit Withdrawal Balance 
01-04-2016 12:00   1    5.00      5.00 
01-04-2016 13:00   2       2.00   3.00 
01-04-2016 13:25   2       1.00   2.00 
02-04-2016 12:00   1    10.00     12.00 
02-04-2016 12:35   2       4.00   8.00 

私はOUTERは、前のトランザクションを選択するために、APPLYを使用してみましたが、ノーシングルに勝つとしていますクエリ。任意の支援が評価されます

SELECT 
    [UserID], [DateTime], 
    T.[Value] * 
    (CASE 
     WHEN [TransactionTypeID] IN (1, -- deposit 
            2 -- withdrawal 
            ) 
      THEN -1 
      ELSE 1 
    END), 
    T2.Value AS PrevValue 
FROM 
    [Transaction] T 
OUTER APPLY 
    (SELECT TOP 1 T2.[Value] 
    FROM [Transaction] T2 
    WHERE UserID = 3112 
     AND T2.[TransactionID] > T.TransactionID 
    ORDER BY T2.TransactionID) AS T2 
WHERE 
    T.[UserID] = 3112 
ORDER BY 
    T.[TransactionID] DESC 

答えて

0

あなたが求めているクエリは次のようになります。..

SQL 2005

SELECT [DateTime], 
     [TransactionID], 
     [Deposit] = CASE WHEN TransactionTypeID = 1 THEN [Value] END, 
     [Withdrawal] = CASE WHEN TransactionTypeID = 2 THEN -[Value] END, 
     [Balance] = CASE TransactionTypeID WHEN 1 THEN [Value] 
               WHEN 2 THEN -[Value] END + ISNULL([PrevValue], 0) 
FROM [Transaction] t1 
     OUTER APPLY (SELECT SUM(CASE TransactionTypeID WHEN 1 THEN [Value] 
                 WHEN 2 THEN -[Value] END) AS [PrevValue] 
         FROM [Transaction] t2 
         WHERE t1.UserID = t2.UserID AND t2.[DateTime] < t1.[DateTime]) ca 
WHERE UserID = 3112 

SQL 2008+

SELECT [DateTime], 
     [TransactionID], 
     [Deposit] = CASE WHEN TransactionTypeID = 1 THEN [Value] END, 
     [Withdrawal] = CASE WHEN TransactionTypeID = 2 THEN -[Value] END, 
     [Balance] = SUM(CASE TransactionTypeID WHEN 1 THEN [Value] 
                WHEN 2 THEN -[Value] END) 
          OVER (ORDER BY [DateTime]) 
FROM [Transaction] 
WHERE UserID = 3112 
-1

私はSQL Server 2012ソリューションを見つけました。古いバージョンを使用している場合は、代替案を確認してください。

それはSUM OVERを使用しています。..

select [TransactionID], 
[DateTime], 
(CASE WHEN [TransactionTypeID] IN (
           1, -- deposits 
           2 -- withdrawals 
          ) 
        THEN -[Value] 
        ELSE [Value] 
        END 


       ), 
     sum((CASE WHEN [TransactionTypeID] IN (
           1, -- deposits 
           2 -- withdrawals 
          ) 
        THEN -[Value] 
        ELSE [Value] 
        END 


       )) over(order by [DateTime] rows unbounded preceding) as runningtotal 
from [Transaction] 
WHERE UserID = 3112 
+0

このクエリの出力はOPの基準を満たしていません。入金か退出かにかかわらずすべての値を単純に差し引きます – JamieD77

関連する問題