0

まずは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)

今、彼らが尋ねたように、私はちょうど1つの結果を得ました:

ProductName 1 Rhönbräu Klosterbier
それでも、私のクエリが良かったとは思えません。SELECT 内に SELECT が本当に必要ですか?
なぜか重複しているような気がします。
どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

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 句の select) を使用しても問題ありません。時には必要ですらあります。ほとんどの場合、上記のように内部結合を使用しますが、データセットが十分に小さい場合は、クエリ時間に大きな違いはありません。

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

問題の再考:

上で示したデータセットを見てみましょう。販売された製品の数を知るために使用できるのはどれですか? 顧客は製品を注文する必要がありますよね?該当する可能性のある 2 つのテーブルを見ると、1 つには販売されたアイテムの数、数量に関する詳細が含まれています。または、注文に表示される回数で人気を考えることができます。そのデータセットから始めて、これまでに行った方法と同様の方法を使用しますが、おそらく合計とグループ化を使用する必要があります。なんで?おそらく複数の顧客が商品を購入したのでしょう。

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

于 2016-04-25T22:38:20.347 に答える
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;
于 2016-04-25T23:08:56.417 に答える
0

各商品の注文数をカウントすることで、最も人気のある商品を見つけることができます. そして、注文数が最も多い商品が最も人気のある商品になります.

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

;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 Server 2012 以降のバージョンを使用している場合は、' with ties' を使用して、同じ注文数を持つ複数の製品を取得します。

;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 with ties ProductName
FROM cte_1
ORDER BY CNT desc

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

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

また

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

また

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
于 2016-10-17T09:20:59.723 に答える