如何在SQL Server中平均分配无归属合同给合同经理?
SQL Server合同批量分配解决方案
一、统计待分配合同数量
执行以下SQL语句,快速获取ContractManagerID为NULL的合同总数:
SELECT COUNT(*) AS 待分配合同数量 FROM Contract WHERE ContractManagerID IS NULL;
二、批量循环分配合同
最优实现方式是利用窗口函数生成序号结合取模运算,实现按ContractManagerID顺序的均匀循环分配,具体代码及逻辑如下:
WITH 待分配合同 AS ( SELECT ContractID, -- 按ContractID升序生成连续序号,保证分配顺序稳定 ROW_NUMBER() OVER (ORDER BY ContractID) AS 合同序号 FROM Contract WHERE ContractManagerID IS NULL ), 经理列表 AS ( SELECT ContractManagerID, -- 按ContractManagerID排序生成经理序号 ROW_NUMBER() OVER (ORDER BY ContractManagerID) AS 经理序号, -- 动态获取经理总数,适配后续人员变动 COUNT(*) OVER () AS 经理总数 FROM ContractManager ) UPDATE c SET c.ContractManagerID = m.ContractManagerID FROM Contract c JOIN 待分配合同 dc ON c.ContractID = dc.ContractID JOIN 经理列表 m ON (dc.合同序号 - 1) % m.经理总数 + 1 = m.经理序号;
逻辑说明
(dc.合同序号 - 1) % m.经理总数 + 1:通过取模实现循环匹配,比如6个合同、3位经理时,合同序号1-3对应经理1-3,序号4-6再次对应经理1-3,确保每位经理分到2个合同;- 窗口函数
ROW_NUMBER()保证分配顺序固定,不会出现随机分配的情况; - 动态获取经理总数,后续经理数量变化时无需修改代码即可适配。
内容的提问来源于stack exchange,提问作者Jess8766
相关产品推荐
相关产品推荐

