[英]TSQL - How to Update a column in a table with iteration
create table task as
WITH tasks as
(select 1 taskid,1 staffid, 'Task 1' title,getdate()-1 createdDate union all
select 2 taskid,1 staffid, 'Task 2' title,getdate()-2 createdDate union all
select 3 taskid,1 staffid, 'Task 3' title,getdate()-3 createdDate union all
select 4 taskid,1 staffid, 'Task 4' title,getdate()-4 createdDate union all
select 5 taskid,1 staffid, 'Task 5' title,getdate()-5 createdDate union all
select 6 taskid,1 staffid, 'Task 6' title,getdate()-6 createdDate union all
select 7 taskid,1 staffid, 'Task 7' title,getdate()-7 createdDate union all
select 8 taskid,1 staffid, 'Task 8' title,getdate()-8 createdDate union all
select 9 taskid,1 staffid, 'Task 9' title,getdate()-9 createdDate
)
SELECT * FROM tasks
update task
set staffid = case when mod(taskid,4) =1 then 1
when mod(taskid,4) =2 then 2
WHEN mod(taskid,4) =3 then 3
WHEN mod(taskid,4) =0 then 4
end from task b
where taskid=b.taskid;
如果您知道taskid沒有空格,那么對其進行算術即可解決您的問題。 否則,您可以使用row_number()
:
with toupdate as (
select t.*, row_number() over (order by t.taskid) as seqnum
from tasks t
)
update toupdate
set staffid = ((seqnum - 1) % 4) + 1;
您可以使用它來分配人員來執行任務,請閱讀注釋以適應您的需求(如果需要)。
DECLARE @AmountStaffToAssign INT = 4
;WITH SequentialStaffIDs AS
(
-- Get a sequential ID asigned to each of your StaffID (if not already sequential)
SELECT TOP (@AmountStaffToAssign)
S.StaffID,
SequentialID = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM
Staff AS S
-- You can filter your staff to reassign here and also order them
),
SequentialTaskIDs AS
(
-- Get a sequential ID asigned to each of your TaskID (if not already sequential)
SELECT
S.TaskID,
SequentialID = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM
Task AS S
-- You can filter you tasks to be assigned here
),
TaskReassignment AS
(
SELECT
T.TaskID,
T.SequentialID,
StaffSequentialID = ((T.SequentialID - 1) % @AmountStaffToAssign) + 1
FROM
SequentialTaskIDs AS T
)
UPDATE T SET
StaffID = S.StaffID
FROM
Task AS T
INNER JOIN TaskReassignment AS R ON T.TaskID = R.TaskID
INNER JOIN SequentialStaffIDs AS S ON R.StaffSequentialID = S.SequentialID
這是我的答案: https : //sqleditor.net/q/rk6YcdEtM
UPDATE T SET StaffID = S.StaffID
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY TaskID) % (SELECT COUNT(*) FROM Staff) AS seq, StaffID FROM Tasks
) T
INNER JOIN (
SELECT ROW_NUMBER() OVER (ORDER BY StaffID) % (SELECT COUNT(*) FROM Staff) AS seq, StaffID FROM Staff
) S ON T.seq = S.seq;
GO
您可以在此處嘗試更多詳細信息: https : //sqleditor.net/q/rk6YcdEtM
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.