如何编写SQL查询找出销量最高的产品类别?
没问题,我来帮你搞定这个查询需求!先把三张表的结构清晰列出来,再一步步给出查询方案:
数据库表结构说明
products表
| 字段名 | 描述 |
|---|---|
productId | 主键(Primary Key) |
productCategory | 外键(Foreign Key,关联productCategories.productCategoryId) |
productCategories表
| 字段名 | 描述 |
|---|---|
productCategoryId | 主键(Primary Key) |
productCategoryName | 产品类别名称 |
soldProducts表
| 字段名 | 描述 |
|---|---|
soldProductId | 主键(Primary Key) |
productId | 外键(Foreign Key,关联products.productId) |
补充说明:
soldProducts表中同一个productId出现的次数,就代表该产品的销量。
查询销量最高的产品类别方案
要找出销量高于其他类别的产品类别,核心是先统计每个类别的总销量,再筛选出总销量最高的类别。这里分两种情况处理:
情况1:仅返回单个最高销量类别(如果有并列只取第一个)
适合确定只有一个类别销量最高的场景,用LIMIT就能快速实现:
SELECT pc.productCategoryName, SUM(s.sales_count) AS total_sales FROM ( -- 先统计每个产品的销量 SELECT productId, COUNT(*) AS sales_count FROM soldProducts GROUP BY productId ) s JOIN products p ON s.productId = p.productId JOIN productCategories pc ON p.productCategory = pc.productCategoryId GROUP BY pc.productCategoryId, pc.productCategoryName ORDER BY total_sales DESC LIMIT 1;
情况2:返回所有并列最高销量的类别
如果存在多个类别销量相同且都是最高的,用窗口函数RANK()可以把这些类别都查出来:
WITH category_sales AS ( SELECT pc.productCategoryName, SUM(s.sales_count) AS total_sales, -- 按总销量降序排名,并列的会有相同排名 RANK() OVER (ORDER BY SUM(s.sales_count) DESC) AS sales_rank FROM ( SELECT productId, COUNT(*) AS sales_count FROM soldProducts GROUP BY productId ) s JOIN products p ON s.productId = p.productId JOIN productCategories pc ON p.productCategory = pc.productCategoryId GROUP BY pc.productCategoryId, pc.productCategoryName ) -- 筛选排名第一的所有类别 SELECT productCategoryName, total_sales FROM category_sales WHERE sales_rank = 1;
思路拆解
- 内层子查询先统计每个产品的销量,把
soldProducts里同一productId的记录数算出来; - 关联
products表拿到每个产品对应的类别ID,再关联productCategories表拿到类别名称; - 按类别分组计算总销量;
- 最后要么用
LIMIT取第一,要么用窗口函数筛选出所有排名第一的类别。
内容的提问来源于stack exchange,提问作者cagdas xx
相关产品推荐
相关产品推荐

