SQL如何计算各客户余额占总余额的百分比并在结果中展示
SQL占比计算问题解决方案
错误原因分析
你当前的写法中,GROUP BY customer,balance会将数据按单个客户+对应余额拆分分组,分组后的sum(balance)统计的是每个分组内的余额总和,也就是单个客户自身的余额,和分子的balance值完全相等,因此计算结果永远为100%,不符合需求。
正确实现方案
方案1:窗口函数实现(推荐,适配MySQL8+、PostgreSQL、SQL Server等主流支持窗口函数的数据库)
不需要额外分组,直接用无分区的窗口函数统计全表总余额即可:
SELECT customer, ROUND(balance * 100.0 / SUM(balance) OVER (), 4) AS `%ofTotal` FROM t_customerdata
说明:SUM(balance) OVER ()不会受分组影响,直接计算全表所有客户的总余额,乘以100后用ROUND保留4位小数,输出结果和你预期完全一致。
方案2:子查询实现(适配不支持窗口函数的低版本数据库)
先通过子查询计算出全表总余额,再关联原表做占比计算:
SELECT customer, ROUND(balance * 100.0 / total_balance, 4) AS `%ofTotal` FROM t_customerdata, (SELECT SUM(balance) AS total_balance FROM t_customerdata) AS total_temp
结果验证
全表总余额为100+150+50+95=395,各客户占比计算符合你给出的预期值。
内容的提问来源于stack exchange,提问作者st87_top
相关产品推荐
相关产品推荐

