2017-05-31 37 views
1

我有以下數據:摘要 - 每小時,在間隔

enter image description here

這意味着,我需要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

相關問題