1

開始日と終了日、およびそれらが行われている地域を含むプロジェクトの表を前提として、特定の間隔で1週間にアクティブなプロジェクトの数を出力し、地域ごとにグループ化した結果を取得しようとしています。

プロジェクトには次のようなレコードがたくさんあります

リージョンstart_dateend_date
アラバマ2012-07-082012-08-15
テキサス2012-06-132012-07-24
アラバマ2012-07-252012-09-13
テキサス2012-08-082012-10-28
フロリダ2012-07-032012-08-07
Lousiana 2012-07-14 2012-08-12
...。

1週間の結果が必要な場合は、次のようなことができます。

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

これにより、

リージョンActiveProjectCount
アーカンソー15
ルイジアナ18
ノースダコタ18
オクラホマ27
..。

このクエリを変更して、次のような結果を生成するにはどうすればよいですか?

地域10/0610/1310/20 10/27    
アーカンソー151712 14
ルイジアナ301 5
ノースダコタ181716 15
オクラホマ272319 22
..。

週間隔で、アクティブなプロジェクト(開始日から終了日までのプロジェクト)の総数を確認できます。

4

1 に答える 1

4

あなたはsthを行うことができます。このような:

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を参照してください

于 2012-11-16T23:12:40.540 に答える