SQL获取计数按周和按给定日期间隔的类型分组

时间:2012-11-16 18:19:17

标签: tsql pivot-table group-by

给定一个包含开始日期和结束日期的项目表以及它们正在发生的区域,我试图让我的结果在给定的时间间隔内输出每周活动项目的数量并按地区分组。

我在项目中有很多看起来像

的记录
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
...

在每周的时间间隔内,我可以看到活动项目的总数(开始日期和结束日期之间的项目)

1 个答案:

答案 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