2012-08-29 61 views
3

這是修改了我的前面的問題的版本:TSQL equally divide resultset to groups and update themTSQL - 分排分組基於一個場

我有我有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

例如:

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

+0

頂部的表格數據與底部的示例數據不匹配,它們都不匹配SQL小提琴中的數據。請讓你的例子簡單一致,並提供所需的輸出。 – RedFilter

+0

@RedFilter - 對不起,我已經解決了我的問題,並更新了鏈接到sqlfiddle,所以你可以從我的問題中刪除-1? – Misiu

+1

@Misiu,你說:「我的腳本將分配給3個操作員隨機2訂單與隨機總額的訂單現金」,但後來在您的問題的底部,你說:「我怎麼能(如果我可以)分配操作員到我的訂單的總和還是現金最接近平均水平?「 - 我認爲這些矛盾互相矛盾,但我相信你所問的是兩者的結合,即「我如何根據現金價值將訂單分配給新運營商,以便每個運營商的SUM(CASH)儘可能接近所有運營商的平均CASH?每個運營商都可以訂購。」 –

回答

0

如果我理解這個權利,您是否可以按照最大,然後最小,然後是下一個最大,然後是下一個最小等順序獲得您想要的結果。像這樣:

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