SQL Server 2012,Rank()& SUM()Over()直到条件

时间:2016-08-22 04:09:41

标签: sql-server tsql sql-server-2012 common-table-expression

我真的很困惑如何将这些群体划分为子群体。这是2个订单(约5M)的例子

  • 订单可能包含1个或更多"分组项目"。
  • 组号= 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');

A 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

1 个答案:

答案 0 :(得分:0)

考虑@ Nick.McDermaid关于sendSms这里的解决方案的建议,不可否认它可以改进,但现在它可以解决。

mod %