2016-12-29 11 views
0

サイクルに1回発生する一連のタスクがあり、サイクルを繰り返すことができます。今、最初のiは、一時テーブルでは、次の結果を得るために、これらのタスクの発生を計算し、これらを注文して、その結果をピボットする必要がありました:日時を指定する/サイクル内の日数でグループ化するタスク

enter image description here

このデータは、5日から発生する周期設定のためのものです2016年12月16日(7日サイクル)に2016年12月、各サイクルで5タスクを持つと私は、データがそうのように凝集させたい:

enter image description here

私は最初のデータセットから最終的な結果を取得する方法を考えてカント。最初のデータセットに表示されているように、列の日付の順序は、7-12-2016/8-12-2016より前の9-12-2016のように順序が変わる可能性がありますが、タスクは常に1つの特定のパターン、すなわち「Ecs and print label」は常に「在庫プレビュー」と「注文して薬を受け取る」の後に来ます。

私はいつもルーピングやものを使うことができますが、誰かが私にこの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」のタスクの2サイクルが重複するか、この例のタスク5は常に同じ「FacName」の次のタスク1よりも前の日付を持ちますか? – 3N1GM4

+0

テーブル内のクエリ1にデータがある場合(#tempテーブルに書き込むことで可能ですが、WITHコマンドを使用して実行することもできます)、テーブルがTと呼ばれていれば、ヌル以外の国勢調査の行を選択できますT - あなたは、郵便番号 – Cato

+0

の最初の一致した非ヌル・サイクル・ドロップにCROSS APPLYを適用することもできます。また、5つの日付フィールドのそれぞれに日付値を持つレコードが1つしかないと仮定する( 'Census'、' Cycle Drop'など)をそれぞれの 'FacName'のための各サイクル内で使用しますか?だから同じ周期内に同じ「FacName」を持つ日付で人口統計が設定された2つのレコードは見られないでしょうか? – 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

大変お手伝いしてくれてうれしく思います。役に立つ答えが見つかった場合は、upv​​oteにも気をつけてください。 – 3N1GM4

関連する問題