【发布时间】:2017-01-25 12:05:37
【问题描述】:
在 SQL Server 查询优化方面需要帮助,如下所示:
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
可能我需要对这里提到的每周数据使用 CTE(公用表表达式)
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
【问题讨论】:
标签: sql sql-server sql-server-2008 sql-server-2012