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

连接两表时如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:47:24