如何用SQL按地区返回销售额最高的门店(求sum的最大值)
如何获取各地区销售额最高的门店数据?
现有分布在不同地区的门店销售数据,需要输出每个地区中销售额最高的门店。
示例数据
| Location | Store | price |
|---|---|---|
| A | x | 1.99 |
| A | x | 3.99 |
| A | y | 2.99 |
| B | d | 3.99 |
| B | e | 5.99 |
| B | e | 1.99 |
当前已完成的步骤
先执行以下SQL(注意补充GROUP BY子句,否则聚合函数无法正确计算):
SELECT Location, Store, SUM(price) FROM table1 GROUP BY Location, Store;
得到各门店的销售额汇总结果:
| Location | Store | sum(price) |
|---|---|---|
| A | x | 5.98 |
| A | y | 2.99 |
| B | d | 3.99 |
| B | e | 7.98 |
目标需求
需要仅返回每个地区中销售额最高的门店,结果如下:
| Location | Store | total_sales |
|---|---|---|
| A | x | 5.98 |
| B | e | 7.98 |
实现方案
方案一:窗口函数法(推荐)
利用ROW_NUMBER()或RANK()窗口函数,按地区分组后对销售额降序排序,取每组排名第一的记录:
-- 先汇总各门店销售额 WITH store_sales AS ( SELECT Location, Store, SUM(price) AS total_sales FROM table1 GROUP BY Location, Store ) -- 筛选各地区销售额最高的门店 SELECT Location, Store, total_sales FROM ( SELECT *, -- 按地区分组,销售额高的排前面 ROW_NUMBER() OVER (PARTITION BY Location ORDER BY total_sales DESC) AS rn FROM store_sales ) t WHERE rn = 1;
- 如果同一地区有多个门店销售额并列最高,想要全部返回,把
ROW_NUMBER()替换成RANK()即可。
方案二:子查询关联法
先计算每个地区的最高销售额,再关联回门店汇总表匹配结果:
-- 汇总各门店销售额 WITH store_sales AS ( SELECT Location, Store, SUM(price) AS total_sales FROM table1 GROUP BY Location, Store ), -- 计算各地区的最高销售额 region_max_sales AS ( SELECT Location, MAX(total_sales) AS max_sales FROM store_sales GROUP BY Location ) -- 关联筛选出符合条件的门店 SELECT ss.Location, ss.Store, ss.total_sales FROM store_sales ss JOIN region_max_sales rms ON ss.Location = rms.Location AND ss.total_sales = rms.max_sales;
内容的提问来源于stack exchange,提问作者user19497099
相关产品推荐
相关产品推荐

