2016-04-25 62 views
0

首先,我在練習Northwind數據庫(Microsoft創建)。
表的設計我的工作是:
enter image description hereSELECT中的SQL SELECT? Northwind(微軟)

我試圖解決的問題是:

哪個產品是最流行的? (數量的項目)

好了,我的查詢語句:

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

庫存最多的單位是否等同於最受歡迎的產品?我不認爲這總是一個真實的陳述(事實上甚至可能是相反的)。

對我來說,問題是問,這是最流行的產品售出。如果你這樣想,那麼你會查看每種產品的銷售量並選擇銷售量最高的產品。

這有道理嗎?

關於您的具體查詢,該查詢僅使用產品表。您進行連接,但在查詢中根本不使用它們,並且應該被查詢優化器忽略。

我會親自重寫查詢,如下所示:

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,但如果數據集足夠小,它應該與查詢時間無關。

在這種情況下,您應該重新思考被問到的問題,並考慮最受歡迎的項目的含義。

反思的問題:

讓我們來看看你已經上面顯示的數據集。哪些可以用來告訴你有多少產品已經售出?一位顧客需要訂單一款產品,對吧?查看可能適用的兩個表,其中一個包含有關銷售數量的詳細信息,數量,或者您可以根據訂單中出現的次數來考慮流行度。從這個數據集開始,並使用類似的方法來處理你所做的事情,但也許你必須使用一個總和和分組。爲什麼?也許不止一位顧客購買了該物品。

數據集的問題是它沒有告訴你產品的名稱。它只給你身份證。有一張桌子,雖然有這個信息。即,產品表。你會注意到兩個表都有產品ID變量,並且你可以加入這個變量。

+0

能不能幫我寫你根據表的設計說,有關 '賣' 參數查詢?我認爲你是對的人。 @houstonwp – N3wbie

+0

我會在上面的答案中加入以包含'sold'參數的更多詳細信息。 – houstonwp

+0

考慮「最受歡迎」可能意味着什麼:1.銷售量最多; 2.存在於大多數訂單中。根據您的選擇,答案可能會有所不同。 –

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

這不工作@Marin Relatic – N3wbie

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) 

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