2016-11-14 74 views
0

我有作業號數據庫的數量,預定日期,並重復記錄像這樣的:SQL查詢的計劃時數天

J410 | 11/14/2016 | 50| 

我已經要求出示與某行的報告的每一天這項工作是這樣的:

J410 | 11/14/2016 | 10 | 
J410 | 11/15/2016 | 10 | 
J410 | 11/16/2016 | 10 | 
J410 | 11/17/2016 | 10 | 
J410 | 11/18/2016 | 10 | 

的邏輯是,我們假設10小時天,所以total number of hours divided by 10 = the number of days,那麼用戶需要每一天的行。

我可以輕鬆地獲得天像這樣的數字:

SELECT CEILING(Hours/10.0) - 請注意,某些小時不要10整除,所以我圍捕。

我沒有絲毫的想法如何解決爲每個日期創建(僅用於報告)附加行的問題。

我最初的想法是選擇記錄到臨時表中,然後選擇每個記錄並使用WHILE語句複製記錄,直到達到天數。

任何人都可以提供一個更好的主意嗎?

+0

更新後的SQL服務器。我明白表示我嘗試過,說實話,我幾乎不知道從哪裏開始 – user3511334

回答

1

如果有幫助

Declare @YourTable table (JobNumber varchar(25),Date date,Hours int) 
Insert Into @YourTable values 
('J410','11/14/2016',50) 

;with cte0(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)) 
    ,cteN(N) As (Select Row_Number() over (Order By (Select NULL)) From cte0 N1, cte0 N2, cte0 N3) 
Select A.JobNumber 
     ,Date = DateAdd(DD,N-1,Date) 
     ,Hours = cast(Hours/CEILING(Hours/10.0) as decimal(10,2)) 
From @YourTable A 
Join cteN B on N<=CEILING(Hours/10.0) 

返回

JobNumber Date  Hours 
J410  2016-11-14 10.00 
J410  2016-11-15 10.00 
J410  2016-11-16 10.00 
J410  2016-11-17 10.00 
J410  2016-11-18 10.00 
+0

Yikes !!是的,它可以工作,但我肯定不理解它。我已經看過它,看起來cte是Common Table Expression(我不熟悉),並且我也在OVER關鍵字中掙扎。我要去做一些學習,如果你不介意的話,我可能會問幾個問題。 – user3511334

+0

@ user3511334 cte只需創建一個ad-hoc tally表(1-1000)。 –

+1

@ user3511334 cte0是一個包含10行的數據集cteN對該表進行了3次交叉連接,這將會產生1000行(10 * 10)* 10,然後執行ROW_NUMBER()[查找窗口函數以瞭解以上]哪個創建一個從1增加到1000的數字,然後他加入到該表中,該數字小於或等於小時的天花板除以10 – Matt

0

使用Numbers Table,每天添加到您現有的表,直到到達日期限制...

+0

,因爲它看起來更像是評論而不是答案。這個想法非常好,並指出正確的方向是一個答案,但你應該實際展示如何使用數字/計數表來完成任務。 – Matt

+1

@Matt True ...我的不好 – JohnHC