3

これは私の以前の質問の修正版です: TSQL は結果セットをグループに均等に分割し、それらを更新します

次のような2つのテーブルを持つデータベースがあります。

Orders テーブルには、次のようなデータがあります。

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ます。

例えば:

値が 300、0、50、150、-50、200 の 6 つの注文がある場合Cash、それらの合計は 650 になります。
私のスクリプトは、注文のランダムな合計で 3 つのオペレーターにランダムな 2 つの注文を割り当てる必要がありCashます。
私が取得したいのは、たとえば 300,-50 を operator1 に、200, 0 を 2 番目に、150, 50 を 3 番目に割り当てることです。
この音がクリアであることを願っています:)

期待される出力例を次に示します。

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合計または平均に最も近くなるように、どうすれば(できれば)注文にオペレーターを割り当てることができますか

4

1 に答える 1

0

私がこれを正しく理解している場合、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

次に、この分割値に応じて各演算子を指定します (つまり、3 つの演算子の場合)。

splitCash%3 +1
于 2012-11-30T09:27:50.360 に答える