2016-04-25 48 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

相关问题