以下是满足需求的 SQL 查询及详细解释:
SELECT p.name AS product_name, SUM(o.quantity) AS total_sales, ROW_NUMBER() OVER ( PARTITION BY p.category ORDER BY SUM(o.quantity) DESC, p.product_id ASC ) AS category_rank FROM products p JOIN orders o ON p.product_id = o.product_id GROUP BY p.product_id, p.name, p.category ORDER BY p.category ASC, total_sales DESC;
关键步骤解析:
表连接与聚合
JOIN orders o ON p.product_id = o.product_id GROUP BY p.product_id, p.name, p.category
通过 product_id 关联商品表和订单表,并按商品粒度分组聚合计算总销量 SUM(o.quantity)。
窗口函数生成排名
ROW_NUMBER() OVER ( PARTITION BY p.category ORDER BY SUM(o.quantity) DESC, p.product_id ASC ) AS category_rank
PARTITION BY p.category:按商品类别分区,每个类别独立计算排名。
ORDER BY SUM(o.quantity) DESC:分区内按总销量降序排列。
p.product_id ASC:销量相同时,按商品编号升序排序(确保排名稳定性)。
最终排序规则
ORDER BY p.category ASC, total_sales DESC
复制先按商品类别升序排列,再按总销量降序展示,使结果直观符合“排行榜”形式。