这是我之前的问题的修改版本:TSQL 将结果集平均划分为组并更新它们
我的数据库有 2 个表,如下所示:
订单表有如下数据:
OrderID OperatorID GroupID OrderDesc Status Cash ...
--------------------------------------------------------------------------
1 1 1 small_order 1 300
2 1 1 another_order 1 0
3 1 2 xxxxxxxxxxx 2 1000
5 2 2 yyyyyyyyyyy 2 150
9 5 1 xxxxxxxxxxx 1 50
10 NULL 2 xxxxxxxxxxx 1 150
11 NULL 3 xxxxxxxxxxx 1 -50
12 4 1 xxxxxxxxxxx 1 200
运算符表:
OperatorID Name GroupID Active
---------------------------------------
1 John 1 1
2 Kate 1 1
4 Jack 2 1
5 Will 1 0
6 Sam 3 0
我可以使用以下查询将我的记录集平等地划分为相同的组:
SELECT o.*, op.operatorName AS NewOperator, op.operatorID AS NewOperatorId
FROM (SELECT o.*, (ROW_NUMBER() over (ORDER BY newid()) % numoperators) + 1 AS randseqnum
FROM Orders o CROSS JOIN
(SELECT COUNT(*) AS numoperators FROM operators WHERE operators.active=1) op
WHERE o.status in (1,3)
) o JOIN
(SELECT op.*, ROW_NUMBER() over (ORDER BY newid()) AS seqnum
FROM Operators op WHERE op.active=1
) op
ON o.randseqnum = op.seqnum ORDER BY o.orderID
演示可在:http ://sqlfiddle.com/#!3/ff47b/1
使用上面的脚本,我可以将订单划分为(几乎)相等的组,但基于操作员的数量或订单,但我需要对其进行修改,以便它将基于总和或订单的操作员分配给Cash
订单。
例如:
如果我有 6 个订单的Cash
值:300、0、50、150、-50、200,它们的总和为 650。
我的脚本应该随机分配给 3 个操作员 2 个订单,其中订单的随机总和Cash
。
我想要得到的是将例如 300,-50 分配给 operator1,将 200, 0 分配给第二个,将 150, 50 分配给第三个。
希望这听起来很清楚:)
这是我希望得到的示例输出:
ORDERID OPERATORID GROUPID DESCRIPTION STATUS CASH NEWOPERATORID
------------------------------------------------------------------------
1 1 1 small_order 1 300 2
2 1 1 another_order 1 0 1
9 5 1 xxxxxxxxxxx 1 50 4
10 (null) 2 xxxxxxxxxxx 1 150 4
11 (null) 3 xxxxxxxxxxx 1 -50 2
12 4 1 xxxxxxxxxxx 1 200 1
我如何(如果可以的话)将操作员分配给我的订单,以便总和Cash
最接近平均值