从SQL中的JOIN获取数据

时间:2012-03-16 21:04:30

标签: sql sql-server sql-server-2008 tsql greatest-n-per-group

对于这个问题的杂乱名称,这是我的第一个SQL。

有谁知道如何获得销售产品最大数量的订单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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

注意:如果您有多个订购了最大数量的订单,这将为您提供单个产品的多个结果。