0

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

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

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

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

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

4

3 回答 3

0

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

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

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

于 2016-04-25T16:23:08.400 回答
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
于 2019-02-03T15:04:14.157 回答
-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() 来获得最受欢迎的产品。休息一下,您可以根据需要使用相关的联接来获取列。

于 2016-04-25T16:25:07.370 回答