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