Need help in SQL server query optimization which is as follow:
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)
and result should be as follow:
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
May be I need to use CTE (common table expressions)for weekly data as mentioned here
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