Tsc*_*ott 5 t-sql sql-server stored-procedures case
我在尝试创建存储过程时遇到了一些问题。我将 Microsoft SQL Server Management Studio 2017 与 T-SQL 结合使用。我有 2 张桌子,eTasks并且eStaff. 以下是每个表的列:
电子员工
StaffID | Name
Run Code Online (Sandbox Code Playgroud)
电子任务
TaskID | StaffID | Title | CreateDate
Run Code Online (Sandbox Code Playgroud)
目前,根据数据显示,所有任务都分配给 StaffID“1”。eTasks 和 eStaff 表都会使用新任务和 Staff 进行更新,或者会被删除,这些表每天都不会具有完全相同的行。有时,eTask 表中会有 1000 行,接下来可能只有 400 行。有时 eStaff 表中会有 3 名工作人员,接下来可能有 12 名。
我想要做的是,当我运行存储过程时,在当前 StaffID 之间均匀分配任务。
到目前为止,这就是我所拥有的:
CREATE PROCEDURE UpdatingeTasksTable
AS
DECLARE t_rowCount INTEGER
DECLARE s_staffIDCount INTEGER
SET t_rowCount = SELECT COUNT(*) FROM eTasks
SET s_staffIDCount = SELECT DISTINCT StaffID FROM eStaff
UPDATE eTasks
SET StaffID = CASE WHEN TaskID % t_rowCount = 1
THEN 1
WHEN TaskID % t_rowCount = 2
THEN 4
WHEN TaskID % t_rowCount = 3
THEN 3
WHEN TaskID % t_rowCount = 4
THEN 2
END
FROM eTasks b
WHERE TaskID = b.TaskID;
Run Code Online (Sandbox Code Playgroud)
我知道,我目前的查询情况如何,它只会将任务分配给 4 个人。有没有办法使CASE语句动态化,这样就不只是一组静态数字?
正如 Ankur 上面提到的那样,这将是使用循环向员工分配任务的一种方法,但可能不是您正在寻找的答案。希望能帮助到你。
IF OBJECT_ID('tempdb..#Result') IS NOT NULL
DROP TABLE #Result
CREATE Table #Result
(
Employee int,
task int
)
-- number of staff
DECLARE @Staff INT = 12 -- could use (SELECT COUNT(*) FROM (SELECT DISTINCT StaffID FROM eStaff) a) to get actual count
-- number of tasks
DECLARE @Task INT = 49 -- could use (SELECT COUNT(*) FROM (SELECT DISTINCT TaskID FROM eTasks) a) to get actual count
DECLARE @Staffholder INT = 1 -- staff place holder for loop
DECLARE @Loop INT = 1
WHILE @Loop <= @Task
BEGIN
INSERT INTO #Result (Employee, task)
SELECT @Staffholder, @Loop
SET @Loop = @Loop + 1
SET @Staffholder = CASE WHEN @Staffholder = @Staff THEN 1 ELSE @Staffholder + 1 END
END
SELECT * FROM #Result
ORDER BY Employee
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |