如何在MySQL中按客户分组汇总金额、计算占比并合并多行求和?
解决MySQL按客户分组计算总金额及占比的问题
首先先明确你的数据表结构和数据:
| date | client | total |
|---|---|---|
| 2015-01-01 | john | 85.00 |
| 2015-01-01 | alfred | 35.00 |
| 2015-01-01 | georgy | 125.00 |
| 2015-01-01 | linda | 42.00 |
| 2015-01-01 | alex | 76.00 |
| 2015-01-01 | john | 94.00 |
| 2015-01-01 | john | 75.30 |
你已经写了部分查询语句,但关联的子查询没完成,下面是完整的可运行SQL,能实现按客户分组计算总金额,以及该客户总金额占当天所有客户总金额的比例:
SELECT c.client, c.total AS client_total, ROUND(c.total * 100 / t.total_all, 1) AS percent FROM ( -- 子查询1:计算每个客户当天的总金额 SELECT client, SUM(total) AS total FROM mytable WHERE date = '2015-01-01' GROUP BY client ) c -- 关联子查询2:计算当天所有客户的总金额(作为占比的分母) JOIN ( SELECT SUM(total) AS total_all FROM mytable WHERE date = '2015-01-01' ) t;
代码解释:
- 第一个子查询
c:通过GROUP BY client对每个客户分组,用SUM(total)计算每个客户在2015-01-01的消费总金额。 - 第二个子查询
t:计算当天所有客户的消费总金额,作为占比计算的分母。 - 最后通过JOIN关联两个子查询,用
ROUND(c.total * 100 / t.total_all, 1)计算占比并保留1位小数。
查询结果示例:
运行上述SQL后,你会得到类似这样的结果:
| client | client_total | percent |
|---|---|---|
| john | 254.30 | 41.1 |
| alfred | 35.00 | 5.7 |
| georgy | 125.00 | 20.2 |
| linda | 42.00 | 6.8 |
| alex | 76.00 | 12.3 |
(注:所有占比加起来会接近100%,因为四舍五入可能有微小误差)
内容的提问来源于stack exchange,提问作者NekoLopez
相关产品推荐
相关产品推荐

