Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询计数(递归)_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

SQL查询计数(递归)

SQL查询计数(递归),sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我的数据库中有下表,其中包含一些我需要计算积分和奖励的交易。 每次出现TxType a时,我应该记录10分。 然后每次出现TxType B时,我必须从这些点中减去PP列的值。 当计算结果为零时,将获得奖励 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

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

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查询,如下所示

SELECT SUM(
   CASE 
      WHEN TxType = 'A' THEN 10
      WHEN TxType = 'B' THEN (PP * -1) 
   END)
FROM myTable
此查询返回值8,这正是基于样本数据的点数。 如何计算给定示例中发生的奖励2


感谢您帮助

在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中,您可以只使用累计总和。

在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中,您可以只使用累计总和。

要完成答案,您只需计算sum为0的记录,即可获得发生的奖励数量:

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
要完成答案,您只需数一数Sum为0的记录即可获得奖励数量:

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

我想你错过了一个t2.id@Khan。谢谢你+据我所知。这就是我期待OP寻找的。我想你错过了一个在t2.id@Khan。谢谢你+据我所知。这就是我期望OP寻找的。你能澄清一下这个查询返回的值是8吗,这正是基于样本数据的点数。如何计算给定示例中发生的奖励2?该查询返回整个数据集。所以很难说清楚你在说什么。@Khan:对不起,我的查询只返回一个值,而不是整个数据集。你错过了求和函数了吗?结果8来自于每种类型的30个tx值减去tx类型时的22个PP之和B@Lorenzo啊,是的。但是2来自哪里?@Khan:2是获得的奖励。每次卡积分达到0分,客户将获得1分奖励。TX id从1到8是第一个奖励,从9到13是第二个奖励。您能否澄清此查询返回的值为8,这正是基于样本数据的点数。如何计算给定示例中发生的奖励2?该查询返回整个数据集。所以很难说清楚你在说什么。@Khan:对不起,我的查询只返回一个值,而不是整个数据集。你错过了求和函数了吗?结果8来自于每种类型的30个tx值减去tx类型时的22个PP之和B@Lorenzo啊,是的。但是2来自哪里?@Khan:2是获得的奖励。每次卡积分达到0分,客户将获得1分奖励。TX id从1到8是第一个奖励,从9到13是第二个奖励。