Я новичок в 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'.
1
R K Sharma 9 Ноя 2016 в 08:16

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)
2
Pரதீப் 9 Ноя 2016 в 05:48

Ознакомьтесь с приведенным ниже кодом и скажите: это то, что вы хотите получить?

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 
1
Mahesh.K 9 Ноя 2016 в 05:33