2014-04-15 117 views
0

我的数据库中包含一些我需要计算积分和奖励的交易的下表。 每当发生TxType A时,我应该记录10分。 然后,我必须从这些点中减去PP列的值,每次出现TxType B时。 当计算结果为零时,就会获得奖励。SQL查询计数(递归)

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 

我已创建SQL查询以calc下点作为遵循

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

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

感谢您使用相关子查询帮助做计算(在SQL Server 2008)

+0

可惜这是2008年 – dean

+0

你能否澄清*“该查询返回值为8,这正好是基于样本数据的点数如何计算发生的奖励(在给定示例中为2)?“*查询返回整个数据集。所以很难说出你在说什么。 – Khan

+0

@Khan:对不起,但我的查询只是返回一个值,而不是整个数据集。你错过了SUM功能吗?结果8来自30(每个类型A tx的值)小于22(tx类型B时的PP总和) – Lorenzo

回答

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 
3

方式一:

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中,您可以使用累积和。

+0

我认为你在'where t2.id <= t.id'后面缺少''''' – Khan

+0

@Khan。 。 。谢谢。 –

+0

Yw .. +1,从我可以告诉。这正是我期待的OP所期待的。 – Khan