Sql server 2012 CTE的递归计算

Sql server 2012 CTE的递归计算,sql-server-2012,recursive-query,reportbuilder3.0,Sql Server 2012,Recursive Query,Reportbuilder3.0,我在寻找一种方法,如何计算公式如下: month 1 result_1 = result_0 + (number_of_open - number_of_close), where result_0 = 0 month 2 result_2 = result_1 + (number_of_open - number_of_close) month 3 result_3 = result_2 + (number_of_open - number_of_close) 我知道从一开始就显示结果时如何

我在寻找一种方法,如何计算公式如下:

month 1
result_1 = result_0 + (number_of_open - number_of_close), where result_0 = 0
month 2
result_2 = result_1 + (number_of_open - number_of_close)
month 3
result_3 = result_2 + (number_of_open - number_of_close)
我知道从一开始就显示结果时如何计算,这意味着:

但当我选择了一些日期时,例如从2015年2月1日开始,就不能正确计算:

这似乎是从一开始就计算出来的。
有没有办法解决这个问题?

我找到了一个很好的解决办法。我一直在寻找如何解决这个问题,并发现我可以使用它,它将作为一个总运行。但如果我需要它在给定的时间范围内工作,我必须使用子查询,所以我不能使用CTE,必须使用临时表。我的代码是:

IF OBJECT_ID('tempdb..#Temp1') IS NOT NULL BEGIN
   drop table #Temp1
end

SELECT * into #Temp1
   from (
SELECT
 datepart(yy, t3.[datestamp]) AS full_year 
,datepart(mm, t3.[datestamp]) AS month_number
,count(*) as number_of_activities
,t2.affected_item
FROM [sm70prod].[dbo].[ACTSVCMGTM1] AS t3 
JOIN [sm70prod].[dbo].[INCIDENTSM1] AS t2 ON t3.number = t2.incident_id
WHERE
t2.affected_item like 'Service_name'
AND (t3.[type] LIKE 'Open')
GROUP BY t2.affected_item, datepart(yy, t3.[datestamp]), datepart(mm, t3.[datestamp])
)
as databases (full_year, month_number, number_of_activities, affected_item)

;
IF OBJECT_ID('tempdb..#Temp2') IS NOT NULL BEGIN
       drop table #Temp2
end

SELECT * into #Temp2
   from (
SELECT
 datepart(yy, t3.[datestamp]) AS full_year 
,datepart(mm, t3.[datestamp]) AS month_number
,count(*) as number_of_activities
,t2.affected_item
FROM [sm70prod].[dbo].[ACTSVCMGTM1] AS t3 
JOIN [sm70prod].[dbo].[INCIDENTSM1] AS t2 ON t3.number = t2.incident_id
WHERE
t2.affected_item like 'Service_name'
AND (t3.[type] LIKE 'Closed')
GROUP BY t2.affected_item, datepart(yy, t3.[datestamp]), datepart(mm, t3.[datestamp])
)
as databases (full_year, month_number, number_of_activities, affected_item)


select * from (select sum(o.number_of_activities - c.number_of_activities) over (ORDER BY c.full_year, c.month_number) as [backlog]
from #Temp1 o full join #Temp2 c on o.full_year = c.full_year and o.month_number = c.month_number) sub
--where 'time condition'
我可以把我的日期/时间条件放在“where”子句中


现在的问题是如何正确地将其添加到代码中,在代码中我使用CTE和少量的“select”与“union all”组合使用。但我想这是另一个问题的故事

了解滚动计数的方式有助于了解条件的范围以及数据的分区方式。此外,这个问题似乎与查询有关,而不是与在report builder 3.0中构建报表有关。有关构建报表的信息是额外的,以提供更广泛的我需要的信息。然而,是的-这是正确的,更多的是关于查询。如果让人困惑,我很抱歉。我想,经过几次尝试,我离目标又近了一步,我找到了一种方法,可以在不改变每月数值的情况下,改变一系列日期来计算它。简而言之,这很简单:“在临时表中选择sum(o.number\u of_activities-c.number\u of_activities)over(按c.full\u year,c.month\u number排序)作为[backlog]”。现在我需要找到如何将其添加到代码的其余部分。无论如何,谢谢!是的,正如您所描述的,您的订单在计算累计滚动数时是正确的,这一点非常重要。没有查询,无法指出问题。关于OVER()的更多信息;