0

首先,我正在练习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
然而,我怀疑我的查询是好的。我真的需要 SELECT 中的 SELECT 吗?
由于某种原因,感觉就像重复。
任何帮助,将不胜感激。谢谢。

4

3 回答 3

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 回答
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 子句中的选择)是完全可以接受的。有时甚至是必要的。大多数时候我会像上面那样使用内部联接,但如果数据集足够小,它与查询时间应该没有太大区别。

在这种情况下,您应该重新考虑被问到的问题,并考虑什么是最受欢迎的项目。

重新思考问题:

让我们看看您在上面显示的数据集。哪个可以用来告诉您已售出多少产品?客户必须订购产品,对吗?查看可能适用的两张表,其中一张包含有关已售商品数量的详细信息,数量,或者您可以根据订单中出现的次数来考虑受欢迎程度。从该数据集开始并使用与您所做的类似的方法,但也许您必须使用 sum 和 group by。为什么?可能不止一位顾客购买了该商品。

数据集的问题在于它没有告诉您产品的名称。它只给你ID。有一个表虽然有这个信息。即产品表。您会注意到两个表都有 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 回答