【发布时间】:2020-06-06 05:16:33
【问题描述】:
设置是这样的。我有 Orders 和 OrderDetails 并且 OrderDetails 有一个项目编号。订单有很多 OrderDetails。在具有约 10,000 个 OrderDetail 行的约 1000 个订单中,我需要具有最多共同项目的前 16 个订单。
经过一周的研究,这是我的尝试。当我到达第 8 次迭代时,我不得不停下来。这是一个循环,但我不知道如何动态设置临时表名称。我也不知道如何确定我何时拥有 16 个最佳订单。
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;
【问题讨论】:
-
欢迎来到 Stack Overflow。为了帮助我们帮助您,请拨打Tour 并阅读How To Ask。看看这个well-structured question,然后看看edit你的问题以及创建a Minimal, Complete, and Verifiable Example for database-related questions所需的详细信息。
-
这有助于澄清我的需要吗?
-
恐怕不是。查看Jon Skeet 和How to post a T-SQL question on a public forum 的Writing the Perfect Question,更清楚地了解网站上的志愿者在寻找什么。
-
为什么你在你的问题中一遍又一遍地添加相同的代码?这只是噪音,与每个人都喜欢在这里看到的minimal reproducible example 几乎相反。
标签: sql sql-server recursion grouping rollup