The setup is this. I have Orders and OrderDetails and the OrderDetails have an Item Number. Orders have many OrderDetails. Out of ~1000 Orders with ~10,000 OrderDetail lines, I need the Top 16 Orders that have the most Items in common.
After a week of research, here's my attempt. When I got to the 8th iteration, I had to stop. It was a loop but I couldn't figure out how to set the temp table names dynamically. I also couldn't figure out how to determine when I had the 16 best Orders.
IF OBJECT_ID('tempdb..#PartNums') IS NOT NULL DROP Table #PartNums
--Gets the part number that is in the most orders
CREATE TABLE #PartNums (ctr int Identity, PartNum varchar(50), CONT int)
INSERT INTO #PartNums SELECT TOP(1) D.PartNum, Count(D.PartNum) AS CONT FROM OrderDetails D
group by D.PartNum
order by CONT desc
--Gets the orders that have the number one part number in it
IF OBJECT_ID('tempdb..#Orders') IS NOT NULL DROP Table #Orders
CREATE TABLE #Orders ( Id int, Ord1 varchar(50), Ord2 varchar(50),PartNum varchar(50))
INSERT INTO #Orders SELECT O.Id,O.Ord1,O.Ord2, D.PartNum
FROM OrderDetails D INNER JOIN
Orders O ON D.OrderId = O.Id
where D.PartNum IN (SELECT partNum from #PartNums WHERE ctr = 1)
-- Using just the orders that have the number 1 part number
-- Get the part number that is next most popular in the orders
--Exclude the first part number from the grouping
INSERT INTO #PartNums SELECT TOP(1) D.PartNum, Count(D.PartNum) as CONT from OrderDetails D inner join #Orders O ON O.Id = D.OrderId
where NOT D.PartNum IN (SELECT partNum from #PartNums)
group by D.PartNum
order by CONT desc
--Gets the orders that have the number one part number in it
IF OBJECT_ID('tempdb..#Orders2') IS NOT NULL DROP Table #Orders2
CREATE TABLE #Orders2 ( Id int, Ord1 varchar(50), Ord2 varchar(50),PartNum varchar(50))
INSERT INTO #Orders2 SELECT O.Id,O.Ord1,O.Ord2, D.PartNum
FROM OrderDetails D INNER JOIN
#Orders O ON D.OrderId = O.Id
where D.PartNum IN (SELECT partNum from #PartNums WHERE ctr = 2)
INSERT INTO #PartNums SELECT TOP(1) D.PartNum, Count(D.PartNum) as CONT from OrderDetails D inner join #Orders2 O ON O.Id = D.OrderId
where NOT D.PartNum IN (SELECT partNum from #PartNums)
group by D.PartNum
order by CONT desc
--Gets the orders that have the number one part number in it
IF OBJECT_ID('tempdb..#Orders3') IS NOT NULL DROP Table #Orders3
CREATE TABLE #Orders3 ( Id int, Ord1 varchar(50), Ord2 varchar(50),PartNum varchar(50))
INSERT INTO #Orders3 SELECT O.Id,O.Ord1,O.Ord2, D.PartNum
FROM OrderDetails D INNER JOIN
#Orders2 O ON D.OrderId = O.Id
where D.PartNum IN (SELECT partNum from #PartNums WHERE ctr = 3)
INSERT INTO #PartNums SELECT TOP(1) D.PartNum, Count(D.PartNum) as CONT from OrderDetails D inner join #Orders3 O ON O.Id = D.OrderId
where NOT D.PartNum IN (SELECT partNum from #PartNums)
group by D.PartNum
order by CONT desc
--Gets the orders that have the number one part number in it
IF OBJECT_ID('tempdb..#Orders4') IS NOT NULL DROP Table #Orders4
CREATE TABLE #Orders4 ( Id int, Ord1 varchar(50), Ord2 varchar(50),PartNum varchar(50))
INSERT INTO #Orders4 SELECT O.Id,O.Ord1,O.Ord2, D.PartNum
FROM OrderDetails D INNER JOIN
#Orders3 O ON D.OrderId = O.Id
where D.PartNum IN (SELECT partNum from #PartNums WHERE ctr = 4)
INSERT INTO #PartNums SELECT TOP(1) D.PartNum, Count(D.PartNum) as CONT from OrderDetails D inner join #Orders4 O ON O.Id = D.OrderId
where NOT D.PartNum IN (SELECT partNum from #PartNums)
group by D.PartNum
order by CONT desc
--Gets the orders that have the number one part number in it
IF OBJECT_ID('tempdb..#Orders5') IS NOT NULL DROP Table #Orders5
CREATE TABLE #Orders5 ( Id int, Ord1 varchar(50), Ord2 varchar(50),PartNum varchar(50))
INSERT INTO #Orders5 SELECT O.Id,O.Ord1,O.Ord2, D.PartNum
FROM OrderDetails D INNER JOIN
#Orders4 O ON D.OrderId = O.Id
where D.PartNum IN (SELECT partNum from #PartNums WHERE ctr = 5)
INSERT INTO #PartNums SELECT TOP(1) D.PartNum, Count(D.PartNum) as CONT from OrderDetails D inner join #Orders5 O ON O.Id = D.OrderId
where NOT D.PartNum IN (SELECT partNum from #PartNums)
group by D.PartNum
order by CONT desc
--Gets the orders that have the number one part number in it
IF OBJECT_ID('tempdb..#Orders6') IS NOT NULL DROP Table #Orders6
CREATE TABLE #Orders6 ( Id int, Ord1 varchar(50), Ord2 varchar(50),PartNum varchar(50))
INSERT INTO #Orders6 SELECT O.Id,O.Ord1,O.Ord2, D.PartNum
FROM OrderDetails D INNER JOIN
#Orders5 O ON D.OrderId = O.Id
where D.PartNum IN (SELECT partNum from #PartNums WHERE ctr = 6)
INSERT INTO #PartNums SELECT TOP(1) D.PartNum, Count(D.PartNum) as CONT from OrderDetails D inner join #Orders6 O ON O.Id = D.OrderId
where NOT D.PartNum IN (SELECT partNum from #PartNums)
group by D.PartNum
order by CONT desc
--Gets the orders that have the number one part number in it
IF OBJECT_ID('tempdb..#Orders7') IS NOT NULL DROP Table #Orders7
CREATE TABLE #Orders7( Id int, Ord1 varchar(50), Ord2 varchar(50),PartNum varchar(50))
INSERT INTO #Orders7 SELECT O.Id,O.Ord1,O.Ord2, D.PartNum
FROM OrderDetails D INNER JOIN
#Orders6 O ON D.OrderId = O.Id
where D.PartNum IN (SELECT partNum from #PartNums WHERE ctr = 7)
INSERT INTO #PartNums SELECT TOP(1) D.PartNum, Count(D.PartNum) as CONT from OrderDetails D inner join #Orders7 O ON O.Id = D.OrderId
where NOT D.PartNum IN (SELECT partNum from #PartNums)
group by D.PartNum
order by CONT desc
--Gets the orders that have the number one part number in it
IF OBJECT_ID('tempdb..#Orders8') IS NOT NULL DROP Table #Orders8
CREATE TABLE #Orders8( Id int, Ord1 varchar(50), Ord2 varchar(50),PartNum varchar(50))
INSERT INTO #Orders8 SELECT O.Id,O.Ord1,O.Ord2, D.PartNum
FROM OrderDetails D INNER JOIN
#Orders7 O ON D.OrderId = O.Id
where D.PartNum IN (SELECT partNum from #PartNums WHERE ctr = 7)
SELECT DISTINCT OrderId FROM OrderDetails where PartNum in (SELECT partNum from #PartNums);
SELECT * FROM #Orders8;