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