2016-04-25 2 views
0

У меня есть список транзакций в таблице для пользователя, который записывает: UserID, DateTime, TransactionType и Value. 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