2012-03-16 3 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

+0

結婚の場合にどのOrderIdを報告するかはどのように決定しますか? – Sparky

+0

私は間違った結果を得ています。商品名でグループ化されたMAX([Order Details] .Quantity)が存在する実際のIDではなく、最も高いIDを取得しています。 –

答えて

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

答えは試しましたが、エラーが発生します –

+0

これはmySQLでは動作しますが、select句のOrderIDは集約の一部ではないため、他のバリアントについてはわからないと思います。 – Sparky

+0

Max(OrderID)を使用して、エラーが消えるかどうかを確認してください。上記の構文はmySQLで動作します – Sparky

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 

あなたが製品ごとに1つだけのレコードを取得します。この方法を更新し、それはあなたが同じで複数の注文を持っている場合ことを意味し最大量では、結果として1つしか得られません。 ORDER BYに列(注文日など)を追加して、最新のものと古いものを選択できます。数量に関係するすべてのレコードを取得する場合は、ROW_NUMBERの代わりにRANKを使用できます。

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()'がより適しています。 –

+0

それは働いたが、正直言って私はちょうどbegginnerであり、私はこのコードの大部分を理解していない。謝罪します。 –

+0

しかし、どうやってネクタイを扱いますか?特定の商品に同じ数量の注文が2つ以上ある場合、このクエリでは最初の商品のみが報告されますか? – Sparky

関連する問題