#sql-server-2005 #common-table-expression
#sql-server-2005 #общее табличное выражение
Вопрос:
Я хочу рекурсивно выполнить цикл через временную таблицу по полю date1, используя следующий запрос в Sql server. Я хочу, чтобы @stardate и @enddate автоматически увеличивались до @stopcriteria, первоначально начиная с
’01/01/2011′ по 31.12.2011′, а затем ’01/01/2012′ по 31.12.2012′ и так далее до @stopCriteria, и результирующий набор должен продолжать объединяться с union. Я написал следующий запрос с использованием cte, но он не работает.
CREATE TABLE #tempbbs576 ( id int, amount money, date1 date)
insert into #tempbbs576(id,amount,date1) values(1,1000,'1/1/2018')
insert into #tempbbs576(id,amount,date1) values(2,20010,'22/3/2019')
insert into #tempbbs576(id,amount,date1) values(3,40010,'1/1/2017')
insert into #tempbbs576(id,amount,date1) values(4,50010,'23/4/2018')
insert into #tempbbs576(id,amount,date1) values(5,60010,'1/1/2018')
insert into #tempbbs576(id,amount,date1) values(6,70010,'21/1/2018')
DECLARE @startDate DATE;
DECLARE @endDate DATE;
DECLARE @stopCriteria DATE;
SET @startDate='01/01/2011'; SET @endDate='12/31/2011'; SET @stopCriteria='01/01/2018';
;WITH ctesequence
AS (SELECT 'Year' Datename(year, Dateadd(year, 1, @startDate)) /*'2012'*/
AS FiscalYear, Count(DISTINCT id) AS Last2Years
FROM [dbo].[#tempbbs576](nolock) WHERE date1 BETWEEN @startDate AND
@endDate AND id IN (SELECT id FROM [dbo].[#tempbbs576]
WHERE date1 < Dateadd(year, -1, @startDate) AND id
NOT IN (SELECT id FROM [dbo].[#tempbbs576] WHERE date1 BETWEEN
Dateadd(year,-1, @startDate) AND Dateadd( year, -1, @endDate ) ))
UNION
SELECT 'Year' Datename(year, Dateadd(year, 1, @startDate)) /*'2012'*/
AS FiscalYear, Count(DISTINCT id) AS Last2Years FROM ctesequence WHERE date1 <= @stopCriteria)
SELECT * FROM ctesequence OPTION(maxrecursion 0)
Пожалуйста, дайте мне знать, возможно ли это через cte.
Заранее спасибо,
Амар