选择基于员工的可用性查询SQL Server 2012

问题描述:

我有两个表,一个用于员工,另一个表示当前和过去的活动。我需要一个函数/查询来根据类型为下一个活动选择一个员工。这里是样本数据:选择基于员工的可用性查询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(其他未被占用的)文员8(跳过5不可用)。

如果下一个分配是技术性的,它应该去约翰,如果约翰不可用,应该返回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 '进行中'。表格下方的文字显示了预期结果的示例。 –

该代码使用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

谢谢,这很好。我发现的唯一的事情是,如果所有员工都很忙,它会返回一个员工而不是空。示例如果我使John/Technical,员工id 3忙/进行中,脚本应该返回null。 –

+0

我再次尝试,它的工作原理,谢谢 –