TSQL - 对动态表使用 Case 语句(行数未知)

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语句动态化,这样就不只是一组静态数字?

Fan*_*tic 0

正如 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)