Поскольку DDL не был задан, я создаю «простой» пример для этого FIDDLE
SELECT
Parts,
STRING_AGG(id,',') WITHIN GROUP (ORDER BY Id) as PartsCombinationInOrder,
COUNT(*) as NumberOfTimes
FROM (
SELECT
Orders.Id, STRING_AGG(Order_details.Part_no,',') WITHIN GROUP (ORDER BY Order_details.Part_no) as Parts
FROM Orders
INNER JOIN Order_Details on Order_Details.Order_id = Orders.Id
GROUP BY Orders.Id
) x
GROUP BY x.Parts
ORDER BY COUNT(*) DESC;
Краткое описание работы STRING_AGG () см. STRING_AGG
Сначала будут получены все статьи по каждому заказу, затем сгруппированы по комбинации этих статей и упорядочены по убыванию. Самая любимая комбинация должна быть сверху.
РЕДАКТИРОВАТЬ:
Еще одна попытка найти все комбинации статей в заказах
WITH Orders as(
SELECT * FROM (VALUES(1),(2),(3),(4)) Orders(Order_Id)
)
, Order_Details as (
SELECT * FROM (VALUES
(1,1,1),(1,2,2),(1,3,3),(1,4,4),(1,5,5),(1,6,6),
(2,1,1),(2,2,2),(2,3,3),(2,4,4),(2,5,5),(2,6,6),
(3,1,1),(3,2,2),(3,3,3),(3,4,4),(3,5,5),(3,6,6),
(4,1,1),(4,2,2),(4,3,7),(4,4,3),(4,5,5),(4,6,6)
) Order_Details(Order_id,Line_no,Part_no)
),combinations as (
SELECT o.Order_Id,
od1.Line_no as Line1, od1.Part_no as Part1,
od2.Line_no as Line2, od2.Part_no as Part2,
od3.Line_no as Line3, od3.Part_no as Part3
FROM Orders o
INNER JOIN Order_Details od1 ON od1.Order_id = o.Order_Id
INNER JOIN Order_Details od2 ON od2.Order_id = o.Order_Id AND od2.Line_no > od1.Line_no
INNER JOIN Order_Details od3 ON od3.Order_id = o.Order_Id AND od3.Line_no > od2.Line_no AND od3.Line_no > od1.Line_no
)
SELECT c.Order_Id, c.Part1, c.Part2, c.Part3, q.count
FROM combinations c
CROSS APPLY (SELECT count(*) as count FROM combinations q WHERE q.Part1=c.Part1 and q.Part2=c.Part2 and q.Part3=c.Part3) q
ORDER BY q.count DESC,c.Part1,c.Part2,c.Part3, c.Order_Id;
вывод:
Order_Id Part1 Part2 Part3 count
----------- ----------- ----------- ----------- -----------
1 1 2 3 4
2 1 2 3 4
3 1 2 3 4
4 1 2 3 4
1 1 2 5 4
2 1 2 5 4
✂✂✂✂✂
4 3 5 6 4
1 1 2 4 3
2 1 2 4 3
3 1 2 4 3
1 1 3 4 3
2 1 3 4 3
3 1 3 4 3
1 1 4 5 3
✂✂✂✂✂
2 4 5 6 3
3 4 5 6 3
4 1 2 7 1
4 1 7 3 1
4 1 7 5 1
4 1 7 6 1
4 2 7 3 1
4 2 7 5 1
4 2 7 6 1
4 7 3 5 1
4 7 3 6 1
4 7 5 6 1
(80 rows affected)
Я думаю, что эта часть легко расширяется, чтобы иметь 'Part4', 'Part5' и др. c, что позволяет сочетать более 3 статей, как показано выше.