这是我之前的问题的修改版本:TSQL equally divide resultset to groups and update them

我的数据库有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

从上面使用脚本,我可以将Orders划分为(几乎)相等的组,但要基于编号或Operator的Orders,但是我需要对其进行修改,以便它将基于总和或Cash的Orders将Operators分配给Orders。

例如:

如果我有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最接近平均

最佳答案

如果我理解这项权利,可以通过按最大,最小,然后第二大,然后第二最小的顺序对“现金”列进行排序来获得所需的结果,例如:

ROW_NUMBER() over (order by CASE WHEN CashOrder % 2 = 1 then Cash else -Cash END) as splitCash

您在查询中向下方提供CashOrder的位置
ROW_NUMBER() over (ORDER by CASH) as CashOrder

然后,根据此拆分值指定每个运算符,即(对于三个运算符):
splitCash%3 +1

关于sql - TSQL-根据一个字段将行分为几组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12180854/

10-16 07:55