gpt4 book ai didi

sql-server - TSQL - 在动态表中使用 Case 语句(行数未知)

转载 作者:行者123 更新时间:2023-12-04 01:39:27 31 4
gpt4 key购买 nike

我在尝试创建存储过程时遇到了一些问题。我将 Microsoft SQL Server Management Studio 2017 与 T-SQL 一起使用。我有 2 张 table ,eTaskseStaff .以下是每个表的列:

电子员工

StaffID | Name

电子任务
TaskID | StaffID | Title | CreateDate

目前,根据数据,所有任务都分配给 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;

我知道,我的查询目前如何,它只会在 4 个人之间分配任务。有没有办法制作 CASE语句是动态的,这样就不只是一组静态数字?

最佳答案

您应该可以使用 row_number() 来做到这一点。 :

with s as (
select s.*, row_number() over (order by (select null)) as seqnum,
count(*) over () as cnt
from estaff
),
t as (
select t.*, row_number() over (order by (select null)) as seqnum
from etasks
)
update t
set staffid = s.staffid
from t join
s
on s.seqnum = (t.seqnum % s.cnt) + 1;

关于sql-server - TSQL - 在动态表中使用 Case 语句(行数未知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49483686/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com