使用FIND_IN_SET和GROUP_CONCAT对子查询结果进行排名
实现门店销售额排名的查询方案
你可以通过窗口函数在现有查询基础上添加排名逻辑,同时输出"排名/总门店数"的格式。以下是优化后的完整SQL:
WITH location_sales AS ( SELECT 'Location 1' AS location, SUM(t_amount) AS sales FROM transaction_1 WHERE t_type = 1 UNION ALL SELECT 'Location 2', SUM(t_amount) FROM transaction_2 WHERE t_type = 1 UNION ALL SELECT 'Location 3', SUM(t_amount) FROM transaction_6 WHERE t_type = 1 ) SELECT location, sales, RANK() OVER(ORDER BY sales DESC) AS rank_num, COUNT(*) OVER() AS total_locations, CONCAT(RANK() OVER(ORDER BY sales DESC), '/', COUNT(*) OVER()) AS rank_display FROM location_sales ORDER BY rank_num;
关键说明:
- 用
UNION ALL替代原查询的UNION:因为各门店数据无重复,UNION ALL不需要去重,执行效率更高 RANK() OVER(ORDER BY sales DESC):按销售额降序计算排名,若存在销售额相同的门店,会跳过后续名次(比如两个门店并列第1,下一个门店排第3);如果需要连续排名(并列第1后下一个排第2),替换为DENSE_RANK() OVER(ORDER BY sales DESC)即可COUNT(*) OVER():获取参与排名的总门店数量CONCAT():将排名和总数量拼接成你需要的"X/Y"格式
兼容说明:
该方案适用于支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等),如果是老版本数据库(如MySQL 5.x),可以用变量模拟排名逻辑,但推荐优先升级到支持窗口函数的版本以简化查询。
内容的提问来源于stack exchange,提问作者clknappy
相关产品推荐
相关产品推荐

