You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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 确保计算时用浮点数而非整数除法,避免结果为0
  • ROUND(..., 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:30:58