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
答案 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
答案 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
分区中排序。
答案 2 :(得分:0)