Reputation: 144
Given a table of projects with start and end dates as well as a region that they are taking place, I am trying to get my result to output the number of active projects per week over a given interval and grouped by region.
I have many records in Projects that look like
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 ....
If I want results for a single week, I can do something like
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
This produces
Region ActiveProjectCount Arkansas 15 Louisiana 18 North Dakota 18 Oklahoma 27 ...
How can I alter this query to produce results that look like
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 ...
Where on a weekly interval, I am able to see the total number of active projects (projects between start and end date)
Upvotes: 1
Views: 1954
Reputation: 1197
you could do sth. like this:
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
intervals can be defined as you wish.
see SQL-Fiddle
Upvotes: 4