2016-08-22 54 views
0

我真的很困惑如何將這些組分成子組。這是2個訂單的示例(超出〜5M)SQL Server 2012中,秩()和SUM()結束()直到條件

  • 訂單可能有一個或多個「分組項目」。
  • 組編號= SUM(ItemQuantity)。
  • 組通過OrderLine訂購

例如,在下面的表中,我們看到一組「3」 &兩組「2」的

OrderNo OrderLine GroupNo ItemQty 
10496  1   3  1  =3 
10496  2   3  1  =3 
10496  3   3  1  =3 
10496  4   2  1  =2(1) 
10496  5   2  1  =2(1) 
10496  6   2  1  =2(2) 
10496  7   2  1  =2(2) 

等級()& DENSE_RANK不解決該問題,因爲有同組的倍數,OrderLines是不同的。

我會加入到另一個表到最後,但我想是一種方法來區分相同的組。也許通過添加一個「子組」字段。

OrderNo OrderLine GroupNo ItemQty Subgroup 
10496  1   3  1  300 
10496  2   3  1  300 
10496  3   3  1  300 
10496  4   2  1  201 
10496  5   2  1  201 
10496  6   2  1  202 
10496  7   2  1  202 

測試下方

CREATE TABLE #temptable( 
     OrderNo varchar(5), 
     OrderLine int, 
     GroupNo int, 
     ItemQty int); 

    INSERT INTO #temptable (OrderNo,OrderLine,GroupNo,ItemQty) 
    VALUES 
    ('10496','1','3','1'), 
    ('10496','2','3','1'), 
    ('10496','3','3','1'), 
    ('10495','1','4','1'), 
    ('10495','2','4','2'), 
    ('10495','3','4','1'), 
    ('10495','4','2','1'), 
    ('10495','5','2','1'), 
    ('10495','6','3','1'), 
    ('10495','7','3','2'), 
    ('10495','8','2','1'), 
    ('10495','9','2','1'), 
    ('10495','10','2','1'), 
    ('10495','11','2','1'), 
    ('10495','12','2','1'), 
    ('10495','13','2','1'); 

一個DO WHILE

SUM(ItemQty)Over(Partition by OrderNo,GroupNo Order by OrderLine) >= GroupNo 

可以工作,但它需要在每一個訂單的每個組中運行。

然後我開始使用XML路徑來查詢每一行,但它真的不會有效。

SELECT distinct t1.OrderNo,t1.GroupNo, 
     STUFF(( SELECT ',' + QUOTENAME(t2.OrderLine) 
        FROM #temptable t2 
        WHERE 
        t2.OrderNo = t1.OrderNo AND t2.GroupNo = t1.GroupNo 
        Order by t2.OrderLine Asc 
        FOR XML PATH(''),TYPE 
        ).value('.', 'NVARCHAR(MAX)') ,1,1,'') 
     AS [Rows] 
    FROM #temptable t1 
    Order by t1.OrderNo,t1.GroupNo 
+0

你想要做什麼以及最終的預期產出是什麼? – TheGameiswar

+0

在你的例子中,所有訂單都有'10496' OrderNo,我認爲它們必須是'10496'和'10495' – Backs

+0

是不是唯一的'OrderNo + GroupNo'? (連接爲字符串) –

回答

0

以@ Nick.McDermaid是關於這裏的mod %建議一個解決方案,誠然它可以改進,但現在它會工作了。

With a as (
    select OrderNo,OrderLine,GroupNo,ItemQty 
    ,CASE 
    WHEN SUM(ItemQty)Over 
    (Partition by OrderNo,GroupNo Order by OrderNo,OrderLine) % GroupNo=1 
    THEN GroupNo*100 
    ELSE NULL END as SG 
    from #temptable) 

    Select a.OrderNo,a.OrderLine,a.ItemQty,a.GroupNo 
    ,MAX(a.SG2)Over(Partition by a.OrderNo,a.GroupNo Order by a.OrderNo,a.OrderLine ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as Subgroup 
    from 
     (Select OrderNo,OrderLine,GroupNo,ItemQty 
     ,CASE WHEN SG IS NULL THEN NULL ELSE SG+RANK()Over(Partition by OrderNo,SG Order by OrderNo,OrderLine) END as SG2 
     from a)a 
    Order by a.OrderNo,a.OrderLine;