MySQL实现Northwind数据库各供应商销量最高产品查询的技术问询
解决每个供应商销量最高产品的MySQL查询问题
嘿,我来帮你搞定这个查询Northwind数据库里每个供应商销量最高产品的问题!先纠正你之前SQL里的一个小误区:用count(*)统计的是订单明细的行数,而实际销量应该是购买数量的总和,也就是SUM(Quantity),这个细节很重要哦。
下面给你两种解决方案,分别适配不同版本的MySQL:
方案一:用窗口函数(MySQL 8.0+ 推荐)
窗口函数是最简洁直观的方式,还能轻松处理并列第一的情况:
WITH ProductSales AS ( SELECT p.SupplierID, p.ProductID, p.ProductName, SUM(od.Quantity) AS TotalSales FROM `order details` od JOIN products p ON od.ProductID = p.ProductID GROUP BY p.SupplierID, p.ProductID, p.ProductName ), RankedProducts AS ( SELECT SupplierID, ProductID, ProductName, TotalSales, -- RANK()会保留并列第一,ROW_NUMBER()只会取一个,按需选择 RANK() OVER (PARTITION BY SupplierID ORDER BY TotalSales DESC) AS SalesRank FROM ProductSales ) SELECT SupplierID, ProductID, ProductName, TotalSales FROM RankedProducts WHERE SalesRank = 1;
代码解释:
ProductSales这个CTE先计算每个产品的总销量,同时关联products表拿到对应的供应商ID和产品名称。RankedProducts用RANK()窗口函数按供应商分组,组内按销量降序排名,这样每个供应商下销量最高的产品排名就是1。- 最后筛选出排名为1的记录,就是我们要的结果。
方案二:用子查询(适配MySQL 5.x 及更早版本)
如果你的MySQL版本不支持窗口函数,用嵌套子查询也能实现:
SELECT p.SupplierID, p.ProductID, p.ProductName, SUM(od.Quantity) AS TotalSales FROM `order details` od JOIN products p ON od.ProductID = p.ProductID GROUP BY p.SupplierID, p.ProductID, p.ProductName HAVING SUM(od.Quantity) = ( SELECT MAX(Sales) FROM ( SELECT SUM(od2.Quantity) AS Sales FROM `order details` od2 JOIN products p2 ON od2.ProductID = p2.ProductID WHERE p2.SupplierID = p.SupplierID GROUP BY p2.ProductID ) AS SupplierProductSales );
代码解释:
- 外层查询先算出每个产品的总销量。
- 内层嵌套子查询先计算当前供应商下所有产品的销量,再取最大值,最后用
HAVING筛选出销量等于这个最大值的产品。
额外提醒
- 因为
order details表名包含空格,所以必须用反引号`包裹,MySQL才能正确识别。 - 如果需要包含从未卖出过的产品(销量为0),可以把
JOIN改成LEFT JOIN,并把SUM(od.Quantity)改成COALESCE(SUM(od.Quantity), 0),不过这类产品通常不会是销量最高的,按需调整即可。
内容的提问来源于stack exchange,提问作者Tomer
相关产品推荐
相关产品推荐

