编写聚合SQL查询:计算各门店销售额占总销售额的百分比
解决方案:添加门店销售额占比列
没问题,这个需求用SQL就能轻松实现,我给你两种可行的方案,适配不同的数据库环境:
方案1:使用窗口函数(推荐,支持PostgreSQL、MySQL 8.0+、SQL Server等)
窗口函数可以直接在分组查询中计算全局的总销售额,代码简洁高效:
SELECT store, SUM(sales) AS total_sales, bill_date, -- 计算占比并保留两位小数 ROUND( (SUM(sales) / SUM(SUM(sales)) OVER ()) * 100, 2 ) AS sales_percentage FROM sales WHERE bill_date = '2018-01-01' -- 修正原SQL的字段名不一致问题(原WHERE用date,结果用bill_date) GROUP BY store, bill_date;
代码解释:
SUM(sales):计算每个门店当天的销售额总和,别名total_sales方便阅读;SUM(SUM(sales)) OVER ():内层SUM(sales)是分组后的门店销售额,外层的窗口函数OVER ()会计算整个结果集的总销售额(即当天所有门店的销售额总和);ROUND(..., 2):将百分比结果保留两位小数,你可以根据需求调整小数位数(比如改成0就是整数百分比)。
预期查询结果:
| store | total_sales | bill_date | sales_percentage |
|---|---|---|---|
| Store A | 100 | 2018-01-01 | 20.24 |
| Store B | 123 | 2018-01-01 | 24.89 |
| Store C | 130 | 2018-01-01 | 26.31 |
| Store D | 113 | 2018-01-01 | 22.56 |
(注:总销售额为100+123+130+113=466,占比计算为「门店销售额/466*100」)
方案2:使用子查询(兼容老版本数据库,比如MySQL 5.x)
如果你的数据库不支持窗口函数,可以用子查询先计算当天的总销售额,再关联计算占比:
SELECT s.store, SUM(s.sales) AS total_sales, s.bill_date, ROUND( (SUM(s.sales) / (SELECT SUM(sales) FROM sales WHERE bill_date = '2018-01-01')) * 100, 2 ) AS sales_percentage FROM sales s WHERE s.bill_date = '2018-01-01' GROUP BY s.store, s.bill_date;
代码解释:
- 子查询
(SELECT SUM(sales) FROM sales WHERE bill_date = '2018-01-01'):单独计算当天所有门店的总销售额; - 后续逻辑和方案1一致,用门店销售额除以总销售额得到百分比。
内容的提问来源于stack exchange,提问作者Taukheer
相关产品推荐
相关产品推荐

