2016-12-29 102 views
0

我有一組在一個週期發生的一次循環可以重複任務。現在,我首先要計算這些任務的事件和訂購這些,然後轉動產生的,以獲得一個臨時表中的下列結果:訂單日期/組任務的天數在一個週期

enter image description here

這個數據是一個週期集,從5日發生2016年12月於具有在每個週期5的任務,我想數據16 2016年12月(7天爲一個週期)被成羣像這樣:

enter image description here

我想不出如何從第一個數據集的最終結果。正如您在第一個數據集中可以看到的那樣,列中的日期順序可以像2016年9月12日至2016年8月12日之前一樣無序排列,但這些任務將始終發生在一個特定模式即'生態和印刷標籤'將始終在'庫存預覽'和'訂購和接收藥物'之後。

我可以隨時使用循環之類的東西,但如果有人能幫助我找到這個ID的正確的查詢非常感激。

下面是一些示例代碼,以創建數據如上所示:

CREATE TABLE tasks (
    CurrentOccurrenceDate DATETIME, 
    TaskID INT, 
    EmpID INT, 
    FacName VARCHAR(50), 
    Census DATETIME, 
    [Cycle Drop] DATETIME, 
    [ECS and Print Label] DATETIME, 
    [Inventory Preview] DATETIME, 
    [Order and Receive Meds] DATETIME 
) 

INSERT INTO tasks (CurrentOccurrenceDate, TaskID, EmpID, FacName, Census, [Cycle Drop], [ECS and Print Label], [Inventory Preview], [Order and Receive Meds]) VALUES 
('2016-12-05', 1, 1, '75TH TERRACE', '2016-12-05', NULL, NULL, NULL, NULL), 
('2016-12-06', 2, 1, '75TH TERRACE', NULL, '2016-12-06', NULL, NULL, NULL), 
('2016-12-07', 3, 1, '75TH TERRACE', NULL, NULL, NULL, '2016-12-07', NULL), 
('2016-12-08', 4, 1, '75TH TERRACE', NULL, NULL, NULL, NULL, '2016-12-08'), 
('2016-12-09', 5, 1, '75TH TERRACE', NULL, NULL, '2016-12-09', NULL, NULL), 
('2016-12-12', 1, 1, '75TH TERRACE', '2016-12-12', NULL, NULL, NULL, NULL), 
('2016-12-13', 2, 1, '75TH TERRACE', NULL, '2016-12-13', NULL, NULL, NULL), 
('2016-12-14', 3, 1, '75TH TERRACE', NULL, NULL, NULL, '2016-12-14', NULL), 
('2016-12-15', 4, 1, '75TH TERRACE', NULL, NULL, NULL, NULL, '2016-12-15'), 
('2016-12-16', 5, 1, '75TH TERRACE', NULL, NULL, '2016-12-16', NULL, NULL) 
+0

會爲任務的兩個週期一樣'FacName'不斷重疊,或將在本示例任務5始終有一個日期早於同'FacName'接任務1? – 3N1GM4

+0

如果你在表中有查詢1中的數據(你可以通過寫入#temp表,也可以使用WITH命令來完成),比如表中稱爲T--然後你可以從中選擇非空的普查行T - 您可以將CROSS APPLY添加到第一個匹配的非空循環下落中,用於empid – Cato

+0

另外,我們是否應該假設只有一個記錄的日期值爲5個日期字段('Census','Cycle Drop「等)在每個」FacName「的每個週期內?因此,我們永遠不會看到兩個帶有'Census'的記錄,它們在同一個週期內具有相同'FacName'的日期? – 3N1GM4

回答

0

我會用一個CTE來標記循環,然後查詢出每個週期與子查詢有關日期值:

WITH tasksEnhanced (CurrentOccurrenceDate, TaskID, EmpID, FacName, Census, [Cycle Drop], [ECS and Print Label], [Inventory Preview], [Order and Receive Meds], cycleNum) AS 
(
    SELECT t1.*, 
      (
       SELECT COUNT(*) 
       FROM tasks t2 
       WHERE t1.FacName = t2.FacName 
       AND t1.TaskID = t2.TaskID 
       AND t2.CurrentOccurrenceDate < t1.CurrentOccurrenceDate 
      ) + 1 AS cycleNum 
    FROM tasks t1 
) 
SELECT DISTINCT 
     te1.FacName, 
     te1.cycleNum, 
     (SELECT Census     FROM tasksEnhanced census WHERE census.FacName = te1.FacName AND census.cycleNum = te1.cycleNum AND census.Census      IS NOT NULL) AS Census, 
     (SELECT [Cycle Drop]    FROM tasksEnhanced cycleDrop WHERE cycleDrop.FacName = te1.FacName AND cycleDrop.cycleNum = te1.cycleNum AND cycleDrop.[Cycle Drop]    IS NOT NULL) AS [Cycle Drop], 
     (SELECT [Inventory Preview]  FROM tasksEnhanced inv  WHERE inv.FacName  = te1.FacName AND inv.cycleNum  = te1.cycleNum AND inv.[Inventory Preview]   IS NOT NULL) AS [Inventory Preview], 
     (SELECT [Order and Receive Meds] FROM tasksEnhanced orderMeds WHERE orderMeds.FacName = te1.FacName AND orderMeds.cycleNum = te1.cycleNum AND orderMeds.[Order and Receive Meds] IS NOT NULL) AS [Order and Receive Meds], 
     (SELECT [ECS and Print Label] FROM tasksEnhanced ECS  WHERE ECS.FacName  = te1.FacName AND ECS.cycleNum  = te1.cycleNum AND ECS.[ECS and Print Label]   IS NOT NULL) AS [ECS and Print Label] 
FROM tasksEnhanced te1 
ORDER BY te1.FacName, te1.cycleNum 
+0

感謝您的幫助,我能夠修改您的查詢,以滿足我的需求... – Arawn

+0

偉大的,很高興它對你有幫助,感謝標記爲接受。如果您發現有用的答案,也可以隨時向上投票。 – 3N1GM4

相關問題