2016-04-25 70 views
0

我有一個記錄用戶ID,日期時間,交易類型和值的用戶表中的交易列表。 TransactionID是主鍵自動增量1. TransactionType定義了存款(1)或取款(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

相關問題