You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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;

思路拆解

  1. 内层子查询先统计每个产品的销量,把soldProducts里同一productId的记录数算出来;
  2. 关联products表拿到每个产品对应的类别ID,再关联productCategories表拿到类别名称;
  3. 按类别分组计算总销量;
  4. 最后要么用LIMIT取第一,要么用窗口函数筛选出所有排名第一的类别。

内容的提问来源于stack exchange,提问作者cagdas xx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:31:00