2016-04-25 17 views
0

まず、Northwindデータベース(Microsoft作成)で練習しています。私が働いている
テーブルデザインは、次のとおりです。
enter image description hereSELECT内でSELECTを実行しますか? Northwind(Microsoft)

私が解決しようとしている質問です:

最も人気のあるどの製品?

まあ、私のクエリだった(アイテム数):彼らは尋ねたとして

SELECT DISTINCT 
P.ProductName 
FROM 
Products P, 
[Order Details] OD, 
Orders O, 
Customers C 
WHERE 
C.CustomerID = O.CustomerID 
and O.OrderID = OD.OrderID 
and OD.ProductID = P.ProductID 
and P.UnitsInStock = (SELECT MAX(P.UnitsInStock) Items 
         FROM Products P) 

さて、私は正確に結果を持っていた:まだ

ProductName 1 Rhönbräu Klosterbier
、私はそれをdoublt私クエリは良好でした。 SELECT内にSELECTが本当に必要ですか?
何らかの理由で重複しているように感じます。
ご協力いただければ幸いです。ありがとう。

答えて

0

在庫のほとんどのユニットは、もっとも人気のある製品と必ず同じですか?私はそれが常に真実であるとは思わない(それは実際には反対でもあり得る)。

私には、最も人気のある製品である質問があります。です。そのように考えるならば、各製品の販売量を見て、最も売れた製品を選択することになります。

それは意味がありますか?

特定のクエリに関しては、クエリはProductsテーブルのみを使用します。結合は行いますが、クエリではまったく使用されず、クエリオプティマイザによって見過ごされるはずです。

私は個人的には、次のようにクエリを書き換えます:あなたの質問について

SELECT 
    P.ProductName 
FROM 
    Products P 
INNER JOIN 
    (SELECT 
     MAX(P.UnitsInStock) AS Items 
    FROM Products P) maxProd 
ON P.UnitsInStock= maxProd.Items 

は、(where句で選択)サブクエリを利用することが完全に許容可能です。時にはそれは必要でさえあります。ほとんどの場合、上記のようにInner Joinを使用しますが、データセットが十分に小さければ、クエリ時間に大きな違いはありません。

このシナリオでは、尋ねられている質問を再考し、最も人気のあるアイテムが何を意味するのかを考える必要があります。

問題を再考:

は、あなたが上に示されてきたデータセットを見てみましょう。どれくらい多くの商品が販売されたかを教えてくれるでしょうか?顧客は注文の商品が必要ですか?潜在的に適用可能な2つの表を見ると、販売された品目の数、の詳細が含まれているか、注文に表示された回数の点で人気があると考えることができます。そのデータセットから始めて、これまでと同様の方法論を使用しますが、おそらく、合計とグループを使用する必要があります。どうして?多分、複数の顧客がその商品を購入したのかもしれない。

データセットの問題は、製品の名前を教えてくれないことです。それはあなたにIDを与えるだけです。この情報を持っている表があります。すなわち、Productsテーブル。両方のテーブルにProduct ID変数があり、これに参加することができます。

+0

あなたは私はあなたがテーブルの設計に応じて '販売' パラメータについて語ったクエリを書いて助けてもらえますか?私はあなたが正しい人だと思います。 @houstonwp – N3wbie

+0

私は上記の「販売された」パラメータの詳細を含めるために私の答えに追加します。 – houstonwp

+0

"最も人気がある"とはどういう意味でしょうか。ほとんどの注文数に存在する。あなたの選択に応じて、答えが異なる場合があります。 –

0

使用したクエリを最も人気のある製品(ベストセラー製品)を取得するに

SELECT ProductName, MAX(SumQuantity) 
FROM (
    SELECT P.ProductName ProductName, 
     SUM(OD.Quantity) SumQuantity 
    FROM [Order Details] OD 
    LEFT JOIN Product P ON 
     P.ProductId = OD.ProductID 
    GROUP BY OD.ProductID 
    ) Res; 
+0

それは動作しません@マリンRelatic – N3wbie

0

あなたは、各製品に注文の数.ANDための最も数が1をカウントすることにより、最も人気のある製品を見つけることができます最も人気のある製品になります。

以下のスクリプトは、注文された注文数に基づいて最も人気のある製品を提供します。

;WITH cte_1 
AS(
SELECT p.ProductID,ProductName, count(OrderID) CNT 
FROM Products p 
    JOIN [Order Details] od ON p.ProductID=od.ProductID 
GROUP BY p.ProductID,ProductName) 
SELECT top 1 ProductName 
FROM cte_1 
ORDER BY CNT desc 

あなたはSQLサーバー2012またはそれ以上のバージョンを使用している場合は、同じ順序数を有する複数の製品をフェッチする「with ties」を使用しています。

サンプルコードでは、最大在庫を保持して製品を引き抜こうとしました。他のテーブル(注文の詳細など)に参加しているので、同じ製品に対して複数の結果が得られます。最大在庫の製品を入手する場合は、次のスクリプトを使用できます。

SELECT ProductName 
FROM Products P 
WHERE P.UnitsInStock = (SELECT MAX(P.UnitsInStock) Items 
        FROM Products P) 

OR

SELECT top 1 ProductName 
FROM Products P 
ORDER BY P.UnitsInStock desc 

OR

SELECT top 1 with ties ProductName --use with ties in order to pull top products having same UnitsInStock 
FROM Products P 
ORDER BY P.UnitsInStock desc 
関連する問題