如何计算CTE结果?

时间:2016-11-09 05:16:56

标签: sql sql-server tsql count common-table-expression

我是sql的新手,我现在创建了一个CTE,我想从CTE结果集中获取行数

DECLARE @start_date date,@end_date DATE ;

select @start_date= min(ETA) from  [dbo].[testTable]
        select @end_date=max(ETA) from  [dbo].[testTable];

    ;WITH  AllDays
              AS ( 
              SELECT   @start_date AS [Date]
              --, 1 AS [level]
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, [Date])
                   --, [level] + 1
                   FROM     AllDays
                   WHERE    [Date] < @end_date )
                   --Insert into #tempETA (CallETA) 
         SELECT [Date]--, [level]
         FROM   AllDays  OPTION (MAXRECURSION 0)

         select count(a.Date),a.Date from AllDays a 

我在这里收到错误:

(1048 row(s) affected)
Msg 208, Level 16, State 1, Line 20
Invalid object name 'AllDays'.

2 个答案:

答案 0 :(得分:2)

CTE可以保存在单个SELECT, INSERT, UPDATE, DELETE的执行范围内定义的临时结果集。您不能在SELECT

的范围之外使用其他CTE

使用@@ROWCOUNT获取CTE的计数。考虑到您需要CTE结果及其计数。

SELECT [Date]--, [level]
FROM   AllDays  OPTION (MAXRECURSION 0)

select @@ROWCOUNT

如果您想要计算成为结果的一部分,请使用COUNT() OVER()

SELECT [Date],count(1)over() as Total_count
FROM   AllDays  OPTION (MAXRECURSION 0)

答案 1 :(得分:1)

查看以下代码并告诉您。这是您想要的。?

DECLARE @start_date date,@end_date DATE ;

select @start_date= min(ETA) from  [dbo].[testTable]
        select @end_date=max(ETA) from  [dbo].[testTable];

    ;WITH  AllDays
              AS ( 
              SELECT   @start_date AS [Date]
              --, 1 AS [level]
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, @start_date)
                   --, [level] + 1
                   FROM     [testTable]
                   WHERE    @start_date < @end_date )
                   --Insert into #tempETA (CallETA) 
         --SELECT [Date]--, [level]
         --FROM   AllDays  OPTION (MAXRECURSION 0)

         select count(a.Date) from AllDays a