2017-05-31 8 views
1
間隔

で、私は次のようしたデータ:概要 - 時間あたり、

enter image description here

私はタスク1などに作業するための10人2H8Hが必要であることを意味し、どの

実行中のすべてのタスクで、1時間に必要な労働者の要約を含むタイムラインを作成するにはどうすればよいですか?このように:

enter image description here

+1

あなたの現在のクエリは次のように何を求めていますか?あなたはどんなエラーを出していますか? –

+0

画像の代わりに入力データをテキストとして入力した方が良いです。 –

+0

@kannan:ああ、そうです、次回 – gaffcz

答えて

2

簡単な条件の集約でのCROSS APPLYとのコンサートはトリックを行うべきです

Declare @YourTable table ([Task] int,[Start] datetime,[End] datetime,[People] int) 
Insert Into @YourTable values 
(1,'2017-03-17 02:00:00','2017-03-17 08:00:00',10) 
,(2,'2017-03-17 02:00:00','2017-03-17 08:00:00',5) 
,(3,'2017-03-17 03:00:00','2017-03-17 05:00:00',8) 
,(4,'2017-03-17 04:00:00','2017-03-17 06:00:00',10) 

Select [01:00] = sum(case when DatePart(HOUR,D)=1 then People else 0 end) 
     ,[02:00] = sum(case when DatePart(HOUR,D)=2 then People else 0 end) 
     ,[03:00] = sum(case when DatePart(HOUR,D)=3 then People else 0 end) 
     ,[04:00] = sum(case when DatePart(HOUR,D)=4 then People else 0 end) 
     ,[05:00] = sum(case when DatePart(HOUR,D)=5 then People else 0 end) 
     ,[06:00] = sum(case when DatePart(HOUR,D)=6 then People else 0 end) 
     ,[07:00] = sum(case when DatePart(HOUR,D)=7 then People else 0 end) 
     ,[08:00] = sum(case when DatePart(HOUR,D)=8 then People else 0 end) 
     ,[09:00] = sum(case when DatePart(HOUR,D)=9 then People else 0 end) 
From @YourTable 
Cross Apply (Select Top (DateDiff(HOUR,[Start],[End])+1) D=DateAdd(HOUR,-1+Row_Number() Over (Order By (Select Null)),[Start]) 
       From master..spt_values n1,master..spt_values n2 
      ) B 

戻り

01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 09:00 
0  15  23  33  33  25  15  15  0 
+0

これは動作します、ありがとうございます!私はそれが動作する方法を理解しようとします – gaffcz

+0

@ gaffczクロス適用は、多くの1レコードを拡大します。起こっていることをよりよく視覚化するには、SELECT * From YourTable ...に変更してください。 –

+0

ああ、ありがとう、今私はそれをはるかに良く理解しています! – gaffcz

2

あなたは以下のようにこれを取得するために時間、集計テーブルとピボットを使用することができます。以下のように

select ISNULL([1],0) as [1:00:00], [2] as [2:00:00],[3] as [3:00:00], [4] as [4:00:00],[5] as [5:00:00] 
,[6] as [6:00:00],[7] as [7:00:00],[8] as [8:00:00],ISNULL([9],0) as [9:00:00] 
from (
    select Hrs= Datepart(hour,RowN),SmPeople= sum(people) from Yourtask 
    cross apply (
     select top (datediff(hour, [start],[end])+1) RowN= DateAdd(hour, row_number() over (order by (Select null))-1, [Start]) 
      from master..spt_values n1, master..spt_values n2 
    ) a 
    group by Datepart(hour,RowN) 
) CalcuatedPeople 
pivot (max(SmPeople) for hrs in ([1],[2],[3],[4],[5],[6],[7],[8],[9])) p 

出力:

+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
| 1:00:00 | 2:00:00 | 3:00:00 | 4:00:00 | 5:00:00 | 6:00:00 | 7:00:00 | 8:00:00 | 9:00:00 | 
+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
|  0 |  15 |  23 |  33 |  33 |  25 |  15 |  15 |  0 | 
+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
+0

これも機能します、ありがとう!!! – gaffcz

関連する問題