Нужна помощь в оптимизации запросов сервера SQL, который является следующим:Оптимизация запросов для недельных данных за месяц
enter declare @sDate datetime
declare @eDate datetime
SET @sDate = '2017-01-01'
SET @eDate = '2017-01-31'
SELECT
@sDate AS [StartDate],
DATEADD(day,6, @sDate) [ENDDATE],
SUM(CASE WHEN GS.[Status] = 'Open' THEN 1 ELSE 0 END) [rcOpen],
SUM(CASE WHEN GS.[Status] = 'Closed' THEN 1 ELSE 0 END) [rcClosed]
FROM GS
WHERE
(GS.[ModifiedDate] > @sDate)
AND
(GS.[ModifiedDate] <= DATEADD(day,6, @sDate))
UNION
SELECT
DATEADD(day,7, @sDate) AS [StartDate],
DATEADD(day,13, @sDate) [ENDDATE],
SUM(CASE WHEN GS.[Status] = 'Open' THEN 1 ELSE 0 END) [rcOpen],
SUM(CASE WHEN GS.[Status] = 'Closed' THEN 1 ELSE 0 END) [rcClosed]
FROM GS
WHERE
(GS.[ModifiedDate] > DATEADD(day,7, @sDate))
AND
(GS.[ModifiedDate] <= DATEADD(day,13, @sDate))
UNION
SELECT
DATEADD(day,14, @sDate) AS [StartDate],
DATEADD(day,20, @sDate) [ENDDATE],
SUM(CASE WHEN GS.[Status] = 'Open' THEN 1 ELSE 0 END) [rcOpen],
SUM(CASE WHEN GS.[Status] = 'Closed' THEN 1 ELSE 0 END) [rcClosed]
FROM GS
WHERE
(GS.[ModifiedDate] > DATEADD(day,7, @sDate))
AND
(GS.[ModifiedDate] <= DATEADD(day,20, @sDate))
UNION
SELECT
DATEADD(day,21, @sDate) AS [StartDate],
DATEADD(day,27, @sDate) [ENDDATE],
SUM(CASE WHEN GS.[Status] = 'Open' THEN 1 ELSE 0 END) [rcOpen],
SUM(CASE WHEN GS.[Status] = 'Closed' THEN 1 ELSE 0 END) [rcClosed]
FROM GS
WHERE
(GS.[ModifiedDate] > DATEADD(day,21, @sDate))
AND
(GS.[ModifiedDate] <= DATEADD(day,27, @sDate))
UNION
SELECT
DATEADD(day,27, @sDate) AS [StartDate],
@eDate [ENDDATE],
SUM(CASE WHEN GS.[Status] = 'Open' THEN 1 ELSE 0 END) [rcOpen],
SUM(CASE WHEN GS.[Status] = 'Closed' THEN 1 ELSE 0 END) [rcClosed]
FROM GS
WHERE
(GS.[ModifiedDate] > DATEADD(day,27, @sDate))
AND
(GS.[ModifiedDate] <= @eDate)
и результат должен быть следующим:
StartDate ENDDATE rcOpen rcClosed
2017-01-01 00:00:00.000 2017-01-07 00:00:00.000 NULL NULL
2017-01-08 00:00:00.000 2017-01-14 00:00:00.000 NULL NULL
2017-01-15 00:00:00.000 2017-01-21 00:00:00.000 12 5
2017-01-22 00:00:00.000 2017-01-28 00:00:00.000 NULL NULL
2017-01-28 00:00:00.000 2017-01-31 00:00:00.000 NULL NULL
Может быть, мне нужно использовать КТР (общие табличные выражения) для еженедельных данных, как указано здесь
how to get the start and end dates of all weeks between two dates in SQL server?
declare @sDate datetime,
@eDate datetime;
select @sDate = '2013-02-25',
@eDate = '2013-03-25';
;with cte as
(
select @sDate StartDate,
DATEADD(wk, DATEDIFF(wk, 0, @sDate), 6) EndDate
union all
select dateadd(ww, 1, StartDate),
dateadd(ww, 1, EndDate)
from cte
where dateadd(ww, 1, StartDate)<= @eDate
)
select *
from cte
Привет iamdave, я пробовал этот путь, но получил следующую ошибку: GROUP BY, HAVING или агрегатные функции не разрешены в рекурсивной части рекурсивного общего выражения таблицы 'cte' –
@DevDeveloper Вы скопировали мой код в точку? Там * не * '' by ',' having' или агрегатная функция в рекурсивной части моего 'cte' ... – iamdave
извините мою ошибку, результат следующий (что не показывает недели с нулевым значением) 'StartDate \t \t EndDate rcOpen \t rcClosed 2017-01-15 00: 00: 00.000 \t 2017-01-22 00: 00: 00,000 \t \t 12 5' –