2017-03-17 37 views
4

SQL Server 2012.我想知道是否有人可以找出我有这个问题。我想找到人们订购的所有不同组合。如果这个人购买了A和B,另一个订购了B和A,我就不感兴趣。我希望列的数量是动态的。订单具有的最大行数。订单SQL组计数条目与动态列数排序

Order Row Art 
1  1 A 
1  2 B 
1  3 C 
2  1 A 
2  2 B 
3  1 C 
3  2 D 
4  1 A 
4  2 B 
5  1 B 
5  2 A 

而结果我想是这样的

Count Art1 Art2 Art3 
3  A  B 
1  C  D 
1  A  B  C 
+0

仅限于3种可能的'Art'值多少? –

回答

5

这里的

示例是一个方法:

  • 首先获得所有产品都在列(以有序的方式)
  • 第二组他们通过这一列获得cou NT
  • 分离出来,作为列

下面是查询

--Create table t1 ([order] int, row int, art varchar(30)) 

--insert into t1 values 
--(1,1,'A'), 
--(1,2,'B'), 
--(1,3,'C'), 
--(2,1,'A'), 
--(2,2,'B'), 
--(3,1,'C'), 
--(3,2,'D'), 
--(4,1,'A'), 
--(4,2,'B'), 
--(5,1,'B'), 
--(5,2,'A') 

    select 
     count(1) as [count], 
     articles, 
     max(numberOfArticles) as numberOfArticles 
    from 
    (
     select 
     [order], 
     count(1) as numberOfArticles, 
     Stuff(   
       (
       SELECT 
        ',' + art 
       FROM t1 AS i 
       WHERE i.[order]=o.[order] 
       ORDER by art asc 
       FOR XML PATH ('') 
       ), 
      1, 1, '') as articles 
     from t1 o 
     group by [order] 
    )t 
    group by articles 

--drop table t1 

输出: enter image description here

+0

非常感谢! = D – Jonas

2

您可以使用PIVOT首先要创建表的转动版本,然后申请GROUP BY为了得到所有可能的组合的数量:

SELECT COUNT(*), Art1, Art2, Art3 
FROM (
    SELECT [Order], [1] AS Art1, [2] AS Art2, [3] AS Art3 
    FROM 
    (
     SELECT [Order], Art, 
      ROW_NUMBER() OVER (PARTITION BY [Order] 
           ORDER BY Art) AS [Row] 
     FROM mytable 
    ) AS src 
    PIVOT 
    (
     MAX(Art) FOR [Row] IN ([1], [2], [3]) 
    ) AS pvt  
) AS t 
GROUP BY Art1, Art2, Art3 

ROW_NUMBER用法:它重新创建字段,以便Art值总是订购的每个Order分区中以同样的方式。

Demo here

+0

正在以这种方式工作..你快! :) – DhruvJoshi

+0

非常感谢! = d – Jonas

0
select count(*),replace(Art,' ','') from 
(select distinct parent_tb.Orderer, 
stuff((select','+Art from Test sun 
where sun.Orderer=parent_tb.Orderer 
for xml path('')),1,1,'') Art 
from Test parent_tb 
) TMp 
group by Art 

enter image description here