【问题标题】:SQL while loop to find the next row based on nameSQL while循环根据名称查找下一行
【发布时间】:2013-12-22 16:52:07
【问题描述】:

我有一个 SQL 触发器,每当签入新客户时,他们都会自动分配给技术人员。像这样的案例陈述,我觉得它很好用

SET @TechOrder = 
(
    CASE
        WHEN @LastTech = 'Tech1' THEN 'Tech2'
        WHEN @LastTech = 'Tech2' THEN 'Tech3'
        WHEN @LastTech = 'Tech3' THEN 'Tech4'
        WHEN @LastTech = 'Tech4' THEN 'Tech1'
        and so on...
        ELSE 'Tech1'
    END
)   

然后它用这个更新插入的订单

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID

这个职位有很多工作变动和转身,我不想每次有新技术时都手动更改 SQL 触发器。我想知道是否有更好的方法来分配基于员工表 WHERE Job_Roll 等于该职位的技术。

我在想一个循环或光标可以用来选择下一个技术,但我不确定我会怎么做。我正在使用 SQL 2008 R2,因此无法使用 LAG/LEAD。

任何帮助将不胜感激。

【问题讨论】:

  • 如何创建一个包含技术人员和最后分配工作订单日期的表格,然后从最大日期中选择它,然后在选择后使用新日期更新它。
  • 这是个好主意,我会研究一下
  • 如果它解决了您的问题,请告诉我,然后我将作为答案发布,以便其他人找到您的帖子。
  • 可以,我正在尝试,谢谢
  • 我让它工作了,唯一的问题是添加了新员工并且他们的分配日期为空,因此 max(date) 看不到它。我所做的是在表上设置一个默认约束,以便在添加员工时设置一个 getdate()。再次感谢您的帮助。

标签: sql sql-server-2008-r2 while-loop case


【解决方案1】:

您如何创建一个包含技术人员和最后分配工作订单的日期的表格:(下面的表格和命令只是想法,不要遵循语法)

techTable (
   id        autoincrement value,
   techName  varchar value,
   lastAssign datetime value DEFAULT now() --to the case you 
                                           --insert a new tech      
);

然后您从 MIN 日期中选择它(因为它必须是最后一个处理 WorkOrder 的人)。我在 cmets 上说的是 max,但考虑到工作顺序,它应该是 MIN。

select top 1 id, techName, min(lastAssign)
  from techTable 
 group by id, techName;

然后你选择它,你用一个新的日期更新它。

update techTable set lastAssign = now() where id = idFromTheAboveQuery;

那么这个技术将在下一个 WorkOrder 的最后一个位置。

思考

如果您想改进您的项目,请考虑考虑:

  • 您想了解技术人员的历史记录吗? 在技术表上放置一个字段来确定技术是活跃还是不活跃,然后在您的选择中筛选出活跃技术。

  • 您的技术人员是否轮班工作?您可以创建一个新表 shifts(id, starttime, endtime) 并在 techTable 上放置一个 FK,或者可以是多对多关系。那取决于你。或者只是将另外两个字段放在 techTable 上(startWork 和 endWork),然后在您筛选 where now() between startWork and endWork 的选择上
  • 【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2023-01-21
      • 1970-01-01
      • 2018-06-20
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多