如何通过INNER JOIN计算SKU退货占总退货的百分比?
计算各SKU退货数量占总退货数的百分比
首先,你原SQL的计算逻辑有误:COUNT(RMA.RMAID)/(COUNT(DISTINCT SKU)) 并非退货占比——COUNT(DISTINCT SKU) 是统计不同SKU的数量,而非总退货记录数。要得到正确的百分比,需先获取所有退货的总数量,再用每个SKU的退货数除以这个总数。
方法1:使用子查询获取总退货数
SELECT SKU, COUNT(RMA.RMAID) AS return_count, ROUND((COUNT(RMA.RMAID) * 100.0) / (SELECT COUNT(RMAID) FROM RMA), 2) AS return_percentage FROM Orders INNER JOIN RMA ON Orders.OrderID = RMA.OrderID -- 注意你原SQL里的Order1D是笔误,应改为OrderID GROUP BY SKU ORDER BY return_percentage DESC;
- 子查询
(SELECT COUNT(RMAID) FROM RMA)获取所有退货的总记录数 * 100.0确保计算时用浮点数而非整数除法,避免结果为0ROUND(..., 2)保留2位小数,让百分比更直观
方法2:使用窗口函数(适用于MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)
SELECT SKU, COUNT(RMA.RMAID) AS return_count, ROUND((COUNT(RMA.RMAID) * 100.0) / SUM(COUNT(RMA.RMAID)) OVER(), 2) AS return_percentage FROM Orders INNER JOIN RMA ON Orders.OrderID = RMA.OrderID GROUP BY SKU ORDER BY return_percentage DESC;
SUM(COUNT(RMA.RMAID)) OVER()会计算分组后所有SKU退货数的总和,即总退货数- 这种方法无需额外子查询,代码更简洁
额外说明
- 原SQL里的
Order1D是拼写错误,必须改为OrderID,否则关联会失败 - 如果需要在结果里显示
%符号,可通过字符串拼接实现:比如MySQL用CONCAT(ROUND(...), '%'),SQL Server用CAST(ROUND(...) AS VARCHAR) + '%'
内容的提问来源于stack exchange,提问作者Jakeball4Life
相关产品推荐
相关产品推荐

