2016-06-11 5 views
2

従業員向けのテーブルと、現在のアクティビティと過去のアクティビティのテーブルの2つがあります。タイプに基づいて次のアクティビティの従業員を選択する関数/クエリが必要です。ここでのサンプルデータは、次のとおりです。従業員ベースの可用性の選択クエリSQL Server 2012

表従業員

EmployeesID UserName Type Available 
1   Bill Clerical 1 
2   Ann  Clerical 1 
3   John Technical 1 
4   Jack Technical 0 
5   Mary Clerical 0 
6   Sam  Technical 0 
7   Mark Clerical 1 
8   Andy Clerical 1 
9   Rick Clerical 1 
10   Nancy Clerical 1 

活動

ActivityID EmployeesID Status Task_Datetime 
101    2 Complete 6/11/2016 10:00 
102    1 Complete 6/11/2016 10:12 
103    3 Complete 6/11/2016 10:24 
104    4 Complete 6/11/2016 10:36 
105    7 Complete 6/11/2016 10:48 
106    6 Complete 6/11/2016 11:00 
107    5 Complete 6/11/2016 11:12 
108    8 Complete 6/11/2016 11:24 
109    10 Complete 6/11/2016 11:36 
110    9 Complete 6/11/2016 11:48 
111    5 Complete 6/11/2016 12:00 
112    8 Complete 6/11/2016 12:12 
113    3 Complete 6/11/2016 12:24 
114    4 Complete 6/11/2016 12:36 
115    1 Complete 6/11/2016 12:48 
116    6 Complete 6/11/2016 13:00 
117    7 Complete 6/11/2016 13:12 
118    2 Complete 6/11/2016 13:24 
119    9 Complete 6/11/2016 13:36 
120    10 In Progress 6/11/2016 13:48 
121    1 In Progress 6/11/2016 14:00 
122    2 Complete 6/11/2016 14:12 
123    3 Complete 6/11/2016 14:24 
124    4 Complete 6/11/2016 14:36 
125    6 In Progress 6/11/2016 14:48 

すべてが進行中である場合、進行 に活動をせずに利用従業員のマッチングタイプに割り当てる場合は0 を返す必要があります複数の利用可能なものが割り当てられたものに割り当てられます。

したがって、次の割り当てが事務的である場合、進行中のために1または10を取らないでください。 しかし、最後に最初に完了した2,5,7,8,9(他の占有されていないもの)利用できません)。

次の割り当てが技術的な場合は、Johnに、johnが利用できない場合はnullを返す必要があります。

は、これまでのところ、このような何かを書いた:

function: NextEmployee('Clerical') 

Select EmployeeID from Employees e , Activities a where e.available= 1 and e.type='Clerical' and 
+0

質問を明確にしてください。 Employees.AvailableとActivities.Statusの列の意味についても説明してください。上記のデータに基づいてサンプル結果テーブルを提供します。 – Alex

+0

employees.availableは、従業員が選択可能であることを意味します。 Activities.statusは完了することができます。これは、従業員がアクティビティを完了して選択できること、またはステータスが進行中であることを意味します。これは、従業員が何かに取り組んでいることを意味します。従業員を選択可能にするには、employees.available = 1およびactivities.status <> 'In Progress'を選択します。表の下のテキストは、期待される結果の例を示しています。 –

答えて

2

をこのコードは、各従業員の最後の活動を見つけるためにwindow functionを使用して、この活動は、「完全な」ステータスがあるかどうかをチェックします。

DECLARE @Type VARCHAR(20) 
SET @Type = 'Clerical' 
SELECT TOP 1 TaskType, EmployeesID, Task_DateTime 
FROM(
    SELECT E.EmployeesID, E.TaskType, Task_DateTime, ActivityStatus, ROW_NUMBER() OVER(PARTITION BY A.EmployeesID ORDER BY Task_DateTime DESC) AS LatestEmploeeTask 
    FROM #Activities AS A 
     INNER JOIN #Employees AS E ON A.EmployeesID = E.EmployeesID 
    WHERE Available = 1) AS a 
WHERE LatestEmploeeTask = 1 AND ActivityStatus = 'Complete' 
    AND TaskType = @Type 
ORDER BY Task_DateTime ASC 

を私は、サンプルデータを使用可能なテーブルデータに変換しなければなりませんでした。コードは次のとおりです。

CREATE TABLE #Employees(EmployeesID INT, UserName VARCHAR(10), TaskType VARCHAR(20), Available BIT) 
CREATE TABLE #Activities(ActivityID INT, EmployeesID INT, ActivityStatus VARCHAR(20), Task_DATETIME DATETIME) 

INSERT INTO #Employees 
VALUES 
(1, 'Bill', 'Clerical', 1), 
(2, 'Ann', 'Clerical', 1), 
(3, 'John', 'Technical', 1), 
(4, 'Jack', 'Technical', 0), 
(5, 'Mary', 'Clerical', 0), 
(6, 'Sam', 'Technical', 0), 
(7, 'Mark', 'Clerical', 1), 
(8, 'Andy', 'Clerical', 1), 
(9, 'Rick', 'Clerical', 1), 
(10, 'Nancy', 'Clerical', 1) 

INSERT INTO #Activities 
VALUES 
(101, 2, 'Complete', '6/11/2016 10:00'), 
(102, 1, 'Complete', '6/11/2016 10:12'), 
(103, 3, 'Complete', '6/11/2016 10:24'), 
(104, 4, 'Complete', '6/11/2016 10:36'), 
(105, 7, 'Complete', '6/11/2016 10:48'), 
(106, 6, 'Complete', '6/11/2016 11:00'), 
(107, 5, 'Complete', '6/11/2016 11:12'), 
(108, 8, 'Complete', '6/11/2016 11:24'), 
(109, 10, 'Complete', '6/11/2016 11:36'), 
(110, 9, 'Complete', '6/11/2016 11:48'), 
(111, 5, 'Complete', '6/11/2016 12:00'), 
(112, 8, 'Complete', '6/11/2016 12:12'), 
(113, 3, 'Complete', '6/11/2016 12:24'), 
(114, 4, 'Complete', '6/11/2016 12:36'), 
(115, 1, 'Complete', '6/11/2016 12:48'), 
(116, 6, 'Complete', '6/11/2016 13:00'), 
(117, 7, 'Complete', '6/11/2016 13:12'), 
(118, 2, 'Complete', '6/11/2016 13:24'), 
(119, 9, 'Complete', '6/11/2016 13:36'), 
(120, 10, 'In Progress', '6/11/2016 13:48'), 
(121, 1, 'In Progress', '6/11/2016 14:00'), 
(122, 2, 'Complete', '6/11/2016 14:12'), 
(123, 3, 'Complete', '6/11/2016 14:24'), 
(124, 4, 'Complete', '6/11/2016 14:36'), 
(125, 6, 'In Progress', '6/11/2016 14:48') 
+0

ありがとう、これは良いです。私が見つけている唯一のことは、すべての従業員が忙しい場合、nullの代わりに従業員を返すことです。例私がJohn/Technicalを作成すると、従業員ID 3がビジー/進行中です。スクリプトはnullを返す必要があります。 –

+0

私はもう一度試しました、それは動作します、ありがとう –

関連する問題