基于SQL的Northwind,很难过滤

时间:2016-04-25 16:03:58

标签: sql sql-server northwind

所以在练习网站上有一个问题:

  

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

这意味着有客户,他们想知道客户最受欢迎的有序产品(TOP 1订购产品的总体订单)。
我真诚地不知道如何解决这个问题。
有帮助吗?
我到目前为止所尝试的是:

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

但这远远不是他们所要求的。
在这一篇中,我只获得了最低数量的前1名产品,但这对订购此产品的客户来说并不意味着什么。
这只意味着这个特定项目的数量可能很少而且仍然低于其他项目,而其他项目的数量非常高,现在只是很低(但仍然不够低)
我希望我很清楚。

3 个答案:

答案 0 :(得分:0)

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

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

我不知道您的钥匙是什么,但听起来您实际上想要计算客户订购的次数,因此您可能需要加入Customers表。我在这里假设您有一个表订单,每个订单有一行并共享ProductID密钥。我还假设ProductID在产品中是唯一的(根据您的第一个查询可能不正确)。

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

这实际上取决于您可以使用的表格和密钥。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

您可以锻炼这样的东西,(表名称/架构可能不同)

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()来获得最受欢迎的产品。您可以根据需要使用相关联接来获取列。