按动态列数排序的项目的SQL组计数

按动态列数排序的项目的SQL组计数,sql,sql-server,combinations,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

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
以下是一种方法:

  • 首先在一列中获取所有产品(按顺序)
  • 第二组按此列对其进行分组以获得计数
  • 分栏
下面是查询

--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
输出:

您可以先使用
透视
创建表的透视版本,然后应用
分组方式
,以获得所有可能组合的计数:

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\u NUMBER
的用法:它重新创建
ROW
字段,以便
Art
值在每个
顺序
分区内总是以相同的方式排序


可能的
Art
值的数量是否限制为3?
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