Цикл - определенно неправильный путь.Вместо этого вы хотите использовать таблицу подсчета или чисел.У Джеффа Модена есть отличная статья на эту тему.http://www.sqlservercentral.com/articles/T-SQL/62867/
На самом деле я держу один в моей системе как вид.Это тупо быстро и невероятно полезно.Мой взгляд выглядит следующим образом.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
Тогда использовать его с вашим образцом довольно просто.
select convert(date, DATEADD(day, t.N - 60, dateadd(day, -1, getdate())))
, count(login_time)
from cteTally t
left join #test1 t1 on t1.login_time = convert(date, DATEADD(day, t.N - 60, dateadd(day, -1, getdate())))
where t.N <= 60
group by convert(date, DATEADD(day, t.N - 60, dateadd(day, -1, getdate())))
Этот запрос является полностью динамическим, так как возвращаемые даты будут меняться в зависимости от текущей системной даты.Также обратите внимание, что в размещенных вами образцах данных есть семь строк, которые не учитываются, поскольку они раньше, чем за 60 дней до сегодняшнего дня.
- РЕДАКТИРОВАТЬ -
Поскольку вы можете 't создать вид, который вы можете использовать cte inline.Я вынул последнее соединение, потому что тебе не нужно столько строк.Примерно так.
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E2
)
select convert(date, DATEADD(day, t.N - 60, dateadd(day, -1, getdate())))
, count(login_time)
from cteTally t
left join #test1 t1 on t1.login_time = convert(date, DATEADD(day, t.N - 60, dateadd(day, -1, getdate())))
where t.N <= 60
group by convert(date, DATEADD(day, t.N - 60, dateadd(day, -1, getdate())))
Что касается включения этого в ваш код, я не понимаю, что вы хотите получить в качестве выходных данных, поэтому я спрашивал так много раз.Вы не хотите использовать свой код, как он есть.Это основано на цикле, что вы должны избегать.Его необходимо заменить подходом, основанным на множестве, в этом направлении.