SQL查询计数(递归)

时间:2014-04-15 13:25:31

标签: sql sql-server sql-server-2008 tsql

我的数据库中有以下表格,其中包含一些我需要计算点数和奖励的交易。 每当TxType A出现时,我应记录10分。 然后,每次PP发生时,我必须从这些点中减去TxType B列的值。 当计算结果为零时,即可获得奖励。

ID  TxType  PP
1     A    0
2     B    2
3     B    1
4     B    1
5     B    1
6     B    3
7     B    1
8     B    1
9     A    0
10    B    4
11    B    3
12    B    2
13    B    1
14    A    0
15    B    2

我已经为calc points创建了sql查询,如下所示

SELECT SUM(
   CASE 
      WHEN TxType = 'A' THEN 10
      WHEN TxType = 'B' THEN (PP * -1) 
   END)
FROM myTable

此查询返回值8,这正是基于样本数据的点数。 如何计算发生的奖励(给定示例中为2)?

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

使用相关子查询进行计算的一种方法(在SQL Server 2008中):

select t.*,
       (select sum(case when TxType = 'A' then 10
                        when TxType = 'B' then PP * -1
                   end)
        from mytable t2
        where t2.id <= t.id
       ) as TheSum
from mytable t;

然后,您可以应用值为0时发生的逻辑。在SQL Server 2012中,您可以使用累积总和。

答案 1 :(得分:1)

要完成Gordon Linoff的答案,您只需计算TheSum0的记录,即可获得多少奖励:

SELECT COUNT(1)
FROM (
    SELECT  ID, 
            TxType, 
            PP,
            (   SELECT  SUM(CASE TxType WHEN 'A' THEN 10 WHEN 'B' THEN -PP END)
                FROM    #myTable t2
                WHERE   t2.id <= t1.id
            ) AS TheSum
    FROM #myTable t1
) Result
WHERE TheSum = 0