SQL Group Count of Item以动态的Columns数量排序

时间:2017-03-17 06:14:29

标签: sql sql-server combinations

SQL Server 2012.我想知道是否有人能解决我的问题。

我想找到人们订购文章的所有不同组合。如果这个人已经购买了A和B以及其他有序的B然后A,那我就不感兴趣了。我希望列的数量是动态的。订单的最大行数。

订单示例

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

3 个答案:

答案 0 :(得分:5)

这是一种方法:

  • 首先获取一列中的所有产品(按订单方式)
  • 第二组将它们按此列分组以获得计数
  • 分隔为列

以下是查询

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

答案 1 :(得分: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的使用:它会重​​新创建Row字段,以便Art值始终以相同的方式在每个Order分区中排序。

Demo here

答案 2 :(得分: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