【问题标题】:SQL based Northwind, hard time on filtering基于 SQL 的 Northwind,过滤困难
【发布时间】:2016-04-25 16:03:58
【问题描述】:

所以在练功场有一个问题:

哪款产品最受欢迎? (项目数)

这意味着有客户,他们想知道客户最热门的订购产品(TOP 1 订购产品的总订单)。
我真的不知道如何解决这个问题。
有什么帮助吗?
到目前为止我尝试过的是:

SELECT TOP(1) ProductID, ProductName
FROM Products
GROUP BY ProductID, ProductName
ORDER BY COUNT(*) DESC

但这远非他们所要求的。
在这一个中,我只获得了数量最少的前 1 个产品,但这并不意味着订购该产品的客户有任何意义。
这仅意味着此特定项目的数量可能很低,但仍然低于其他项目,而其他项目的数量非常高,现在只是低(但仍然不够低)
我希望我已经足够清楚了。

【问题讨论】:

  • 有订单表吗?
  • 是的。确实,@Mihn Northwind 是 Microsoft 熟悉的用于练习目的的数据库
  • 想想受欢迎程度。最受欢迎的产品可以是 a) 销售量最大的产品,b) 销售量最大的产品,以及 c) 销售给最大数量的独立客户的产品。老好Northwind保留所有这些信息。你必须学会​​如何问他。 提示:查看OrdersOrder Details 表。

标签: sql sql-server northwind


【解决方案1】:

如果该表中存在数据,您可能只需要按比计数更复杂的方式进行排序,例如对数量求和(如果该列存在)。此外,如果 ProductID 和 ProductName 已经是唯一标识符,请注意您根本不需要 group bysum

SELECT TOP(1) ProductID, ProductName FROM Products GROUP BY ProductID, ProductName ORDER BY SUM(Quantity) DESC

我不知道您的密钥是什么,但听起来您实际上想要计算客户订购了多少次,因此您可能需要加入“客户”表。我在这里假设您有一个表 Orders,每个订单有一行并共享 ProductID 键。我还假设 ProductID 在 Products 中是唯一的(根据您的第一个查询,这可能不是真的)。​​

SELECT TOP(1) Products.ProductID, Products.ProductName FROM Products LEFT JOIN Orders ON Orders.ProductID = Products.ProductID GROUP BY Products.ProductID, Products.ProductName ORDER BY COUNT(Orders.OrderID) DESC

这实际上取决于您可以使用哪些表和键。

【讨论】:

    【解决方案2】:
    Select top 1 P.ProductID,P.ProductName,Sum(OD.Quantity)AS Quantity
     From [Order Details] OD
           inner join Products P ON P.ProductID = OD.ProductID
           Group By P.ProductID,P.ProductName
           Order by Quantity Desc
    

    【讨论】:

    • 欢迎来到 StackOverflow。虽然这段代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    【解决方案3】:

    你可以这样锻炼,(表名/模式可能不同)

    with cte_product
    as
    (
    select ProductID,Rank() over (order by Count(1) desc) as Rank from
    Orders O
    inner join Product P
    on P.ProductID = O.ProductID
    group by ProductID
    )
    select P.productID, P.ProductName from
    cte_product ct
    inner join product p
    on ct.productId = p.ProductID
    where ct.Rank = 1
    

    Crux 是使用 RANK() 来获得最受欢迎的产品。休息一下,您可以根据需要使用相关的联接来获取列。

    【讨论】:

    • 完全错误的答案。 Orders 表没有 productID 字段。 Northwind 仍然可以从 Microsoft 下载,@Akanksha Singh 应该先下载。
    • 尊敬的@Alex 先生,感谢您的建议,但我有完整的公司数据库可供使用。而且我不认为记住你最喜欢的 NORTHWIND 作为 SQL 开发人员的先决条件。我同意我不再有 NORTHWIND,我早在我的基本学习阶段就已经有了。此外,如果您再次阅读我的答案,因为用户 N3wbie 和您一样,也是 Northwind 的忠实粉丝,并且没有共享架构,这就是为什么我提到他可以“锻炼这样的东西”并建议去 RANK() 和相关的联接。
    • 亲爱的@Akanksha,这个问题来自一个几乎无法理解 CTE 和 RANK 函数的新生。他们应该先学习简单的东西,不要用非常高级的东西来打击他们的大脑。恕我直言……
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多