给定一个包含开始日期和结束日期的项目表以及它们正在发生的区域,我试图让我的结果在给定的时间间隔内输出每周活动项目的数量并按地区分组。
我在项目中有很多看起来像
的记录region start_date end_date Alabama 2012-07-08 2012-08-15 Texas 2012-06-13 2012-07-24 Alabama 2012-07-25 2012-09-13 Texas 2012-08-08 2012-10-28 Florida 2012-07-03 2012-08-07 Lousiana 2012-07-14 2012-08-12 ....
如果我想要一周的结果,我可以做类似
的事情DECLARE @today datetime
SET @today ='2012-11-09'
SELECT
[Region],
count(*) as ActiveProjectCount
FROM [MyDatabase].[dbo].[Projects]
where (datecompleted is null and datestart < @today) OR (datestart < @today AND @today < datecompleted)
Group by region
order by region asc
这会产生
Region ActiveProjectCount Arkansas 15 Louisiana 18 North Dakota 18 Oklahoma 27 ...
如何更改此查询以生成类似于
的结果Region 10/06 10/13 10/20 10/27 Arkansas 15 17 12 14 Louisiana 3 0 1 5 North Dakota 18 17 16 15 Oklahoma 27 23 19 22 ...
在每周的时间间隔内,我可以看到活动项目的总数(开始日期和结束日期之间的项目)
答案 0 :(得分:4)
with "nums"
as
(
select 1 as "value"
union all select "value" + 1 as "value"
from "nums"
where "value" <= 52
)
, "intervals"
as
(
select
"id" = "value"
, "startDate" = cast( dateadd( week, "value" - 1, dateadd(year, datediff(year, 0, getdate()), 0)) as date )
, "endDate" = cast( dateadd( week, "value", dateadd( year, datediff( year, 0, getdate()), 0 )) as date )
from
"nums"
)
, "counted"
as
(
select
"intervalId" = I."id"
, I."startDate"
, I."endDate"
, D."region"
, "activeProjects" = count(D."region") over ( partition by I."id", D."region" )
from
"intervals" I
inner join "data" D
on D."startDate" <= I."startDate"
and D."endDate" > I."endDate"
)
select
*
from
(
select
"region"
, "intervalId"
from
"counted"
) as Data
pivot
( count(Data."intervalId") for intervalId in ("25", "26", "27", "28", "29", "30", "31")) as p
间隔可以根据需要定义。
请参阅SQL-Fiddle