按动态列数排序的项目的SQL组计数
SQL Server 2012。我不知道是否有人能解决我的这个问题 我想找到人们订购物品的所有不同组合。我不感兴趣的是这个人是否购买了a和B,以及其他订购的B和a。我希望列的计数是动态的。订单拥有的最大行数 订单示例按动态列数排序的项目的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
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