2012-03-16 39 views
1

对不起,这个问题的混乱名称,这是我的第一个SQL问题。从SQL中的JOIN获取数据

有没有人知道如何获得产品最大数量的订单的OrderID

这是我的代码至今:

SELECT Products.ProductName, MAX([Order Details].Quantity), MAX(OrderID) 
FROM Products 
INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID 
GROUP BY Products.ProductName 

当我说我MAX(OrderID)获得该产品出售,而不是实际的ID,其中该产品的最高数量被卖的最高的ID。

这是我第一个关于SQL的问题,对于任何信息缺乏抱歉,只是告诉我需要什么,我会添加它。提前致谢!

编辑:我使用的是SQL Server 2008中

+1

当您尝试运行它时,或者只是返回了0条记录时,您是否收到错误消息? – kingcoyote 2012-03-16 21:06:51

+0

如何决定在关系情况下报告哪个OrderId? – Sparky 2012-03-16 21:09:35

+0

我收到错误的结果。我得到最高的ID,而不是按产品名称分组的MAX([Order Details] .Quantity)所在的实际ID。 – 2012-03-16 21:13:14

回答

1
SELECT Products.ProductName, [Order Details].OrderID, [Order Details].Qty 
FROM Products 
INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID 
WHERE [Order Details].Quantity = (SELECT MAX(p.Quantity) FROM [Order Details] p WHERE p.ProductID = Products.ProductID) 

注:这会给你多个结果的单品,如果你有多个订单,最大订货数量。

+0

刚刚尝试了答案,但它给了我一个错误 – 2012-03-16 21:15:18

+0

我认为这将在mySQL中工作,但不确定其他变体,因为select子句中的OrderID不是聚合的一部分。 – Sparky 2012-03-16 21:16:00

+0

尝试使用Max(OrderID)并查看错误是否消失,上面的语法在mySQL中工作 – Sparky 2012-03-16 21:16:43

4

您可以使用分析功能是:

修订

SELECT ProductName, Quantity, OrderID 
FROM ( SELECT Products.ProductName, [Order Details].Quantity, OrderID, 
       ROW_NUMBER() OVER(PARTITION BY Products.ProductName ORDER BY [Order Details].Quantity DESC) Corr 
     FROM Products 
     INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID) A 
WHERE Corr = 1 

这样,您将获得每个产品只有一个记录,这意味着,如果你有一个以上的订单具有相同最大数量,你只能得到一个结果。您可以在ORDER BY上添加更多列(例如订购日期)以选择最新或最旧的列。如果您想获取与数量相关的所有记录,则可以使用RANK而不是ROW_NUMBER

SELECT ProductName, Quantity, OrderID 
FROM ( SELECT Products.ProductName, [Order Details].Quantity, OrderID, 
       RANK() OVER(PARTITION BY Products.ProductName ORDER BY [Order Details].Quantity DESC) Corr 
     FROM Products 
     INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID) A 
WHERE Corr = 1 
+0

+1,但'RANK()'可能更合适。 – 2012-03-16 21:25:45

+0

它的工作,但说实话,我只是一个开山人,我不明白这个代码的大部分。我道歉。 – 2012-03-16 21:28:22

+0

但你如何处理关系?如果一个给定的产品有两个或更多数量相同的订单,这个查询不会只报告第一个订单吗? – Sparky 2012-03-16 21:28:27