2016-06-11 44 views
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(其他未被佔用的)文員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 <>'進行中'。表格下方的文字顯示了預期結果的示例。 –

回答

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

謝謝,這很好。我發現的唯一的事情是,如果所有員工都很忙,它會返回一個員工而不是空。示例如果我使John/Technical,員工id 3忙/進行中,腳本應該返回null。 –

+0

我再次嘗試,它的工作原理,謝謝 –