连接两表时如何按SKU统计订单数、退货数及退货率?
解决SKU订单数、退货数及退货率同表统计问题
核心思路
通过左连接Orders和RMA表,按SKU分组聚合,分别统计订单数、退货数,再计算退货率。左连接能保证所有SKU(包括无退货的)都出现在结果中,避免数据丢失。
场景1:统计退货产品总数(每条RMA记录对应一个退货产品)
SELECT o.SKU, COUNT(o.OrderID) AS NumberOrdered, -- 用COALESCE把NULL转为0,避免无退货SKU的退货数显示为空 COALESCE(COUNT(r.RMAID), 0) AS NumberReturned, -- 用100.0确保浮点除法,ROUND保留2位小数保证可读性 ROUND(COALESCE(COUNT(r.RMAID), 0) * 100.0 / COUNT(o.OrderID), 2) AS ReturnRate FROM Orders o -- 左连接关联订单ID,保留所有SKU的订单数据 LEFT JOIN RMA r ON o.OrderID = r.OrderID GROUP BY o.SKU ORDER BY o.SKU;
场景2:统计退货订单数(一个订单无论退多少产品,只算一次退货)
如果需要统计的是有退货行为的订单数量(而非退货产品总数),将COUNT(r.RMAID)替换为COUNT(DISTINCT r.OrderID)即可:
SELECT o.SKU, COUNT(o.OrderID) AS NumberOrdered, COALESCE(COUNT(DISTINCT r.OrderID), 0) AS ReturnedOrdersCount, ROUND(COALESCE(COUNT(DISTINCT r.OrderID), 0) * 100.0 / COUNT(o.OrderID), 2) AS ReturnRate FROM Orders o LEFT JOIN RMA r ON o.OrderID = r.OrderID GROUP BY o.SKU ORDER BY o.SKU;
为什么之前的子查询失效?
你之前的子查询没有按SKU做关联过滤,直接返回了全局总退货数。比如错误写法:
-- 错误示例:子查询未关联当前SKU,返回总退货数 SELECT o.SKU, COUNT(o.OrderID) AS NumberOrdered, (SELECT COUNT(*) FROM RMA) AS NumberReturned FROM Orders o GROUP BY o.SKU;
必须在子查询中加入SKU关联条件才能获取对应SKU的退货数,但这种写法效率不如JOIN方案,优先推荐前面的左连接写法。
内容的提问来源于stack exchange,提问作者VandalEvil
相关产品推荐
相关产品推荐

