我有一个像这样的CTE查询:
declare @stop datetime
set @stop='2014-12-12 00:00:00.000'
declare @start datetime
set @start='2011-12-12 00:00:00.000'
declare @temp datetime
set @temp=@start
with X(A,B) AS(
select @Temp as A,count(*) as B
from Table1
where left(convert(varchar,Table1Row1,120),4)=left(convert(varchar,@Temp,120),4)
union all select dateadd(year,1,(select X.A from X)) as A,count(*) as B
from Table1
where left(convert(varchar,Table1Row1,120),4)=left(convert(varchar,(select X.A from X),120),4)
and datediff(YYYY,(select X.A from X),@stop)>0)
select A,B into #TempTbl1 from X option(maxrecursion 32767);
我试图从@start到@stop获取每年的行数。该查询接受select语句中X的选择X.A,但不接受where子句。
我收到编译时错误说明:公共表表达式的递归成员' X'有多个递归引用。
执行时,我在子查询中不允许出现错误递归引用。但是,我刚刚在select查询中引用它,它没有显示任何错误。是否存在语法问题,或者我不允许在那里引用该表?
答案 0 :(得分:1)
select dateadd(year,1,(select X.A from X)) as A,count(*) as B
from Table1
where left(convert(varchar,Table1Row1,120),4)=left(convert(varchar,(select X.A from X),120),4)
and datediff(YYYY,(select X.A from X),@stop)>0
在查询中选择X三次。尝试从Table1和X而不是3个子查询进行连接。
此外,我认为此查询可以更轻松地完成。 类似的东西:
SELECT DATEPART(year, datecolumn), COUNT(pk)
FROM Table1
WHERE datecolumn between @startdate AND @enddate
GROUP BY DATEPART(year, datecolumn)
答案 1 :(得分:0)
正如我的评论中所述,我没有看到与日期范围和Table1
的关系。我会假设某种date
或datetime
列。
如果您的表有要使用的列,则只需执行以下查询即可。
select DatePart (year,Table1DateTimeColumn) as Year,
count (*) as Cnt
from Table1
where Table1DateTimeColumn between @Start and @Stop
group by DatePart (year,Table1DateTimeColumn)