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

选择基于员工的可用性查询SQL Server 2012,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有两张表,一张是员工的,另一张是他们当前和过去的活动。我需要一个函数/查询,用于根据类型选择下一个活动的员工。以下是示例数据: ActivityID EmployeesID Status Task_Datetime 101 2 Complete 6/11/2016 10:00 102 1 Complete 6/11/2016 10:12 103 3 Complete

我有两张表,一张是员工的,另一张是他们当前和过去的活动。我需要一个函数/查询,用于根据类型选择下一个活动的员工。以下是示例数据:

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
表雇员

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
活动

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 如果有多个可用,请指定给已指定的一个

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
所以如果下一个任务是文书,不要拿1或10,因为正在进行中, 但以最新完成的2,5,7,8,9(其他未占用的)文书为例,这是8(跳过5,因为不可用)

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
若下一个赋值是技术性的,它应该转到John,若John不可用,则应该返回null

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
到目前为止,我写了这样的东西:

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
function: NextEmployee('Clerical')

Select EmployeeID from Employees e , Activities a where e.available= 1 and e.type='Clerical' and
此代码使用查找每个员工的最后一个活动,然后检查此活动是否处于“完成”状态:

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
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
我必须将样本数据转换成可用的表数据。代码如下:

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
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')

请澄清你的问题。请解释Employees.Available和Activities.Status列的含义。根据上述数据提供样本结果表。employees.available表示员工可供选择。Activities.status可以是complete,这意味着员工已完成活动并可以选择;或者status可以是Progress,这意味着员工正在处理某些事情。对于要选择的员工,employees.available=1和activities.status“In Progress”。下表的文本显示了一个具有预期结果的示例。谢谢,这很好。我发现的唯一一件事是,如果所有员工都很忙,它将返回一个员工而不是null。示例:如果我使John/Technical、员工id 3忙/进行中,脚本应返回null。