多销售表关联按客户、月度汇总销售额问题求解
问题根因
- 原有SQL使用
CROSS JOIN关联三个产品的统计子查询,只有同时在三张产品表有消费记录的客户+月度组合才会被保留,导致漏统计仅购买单类/两类产品的客户 - 子查询存在笔误,例如统计product_b销售额的逻辑中错误调用了
product_a.amount,基础计算逻辑本身就出错
解决方案
不需要分别统计三类产品再关联,直接先合并三张产品表的销售数据再做汇总,从根源避免JOIN导致的数据丢失:
SELECT c.customer_id, t.month_id, ROUND(SUM(p.amount), 2) AS total FROM customer c -- 合并三张产品表的所有销售记录 LEFT JOIN ( SELECT customer_id, date_id, amount FROM product_a UNION ALL SELECT customer_id, date_id, amount FROM product_b UNION ALL SELECT customer_id, date_id, amount FROM product_c ) p ON c.customer_id = p.customer_id -- 关联时间映射表获取月度维度 LEFT JOIN time_id t ON p.date_id = t.date_id -- 若需要输出所有客户(包括当月无消费、销售额为0的客户),删除下面这行WHERE条件即可 WHERE p.amount IS NOT NULL GROUP BY c.customer_id, t.month_id ORDER BY t.month_id, c.customer_id;
补充说明
如果需要保留所有客户的记录(哪怕当月无消费也展示销售额为0),删除上述WHERE条件,同时把求和逻辑修改为ROUND(SUM(IFNULL(p.amount,0)), 2)即可。
内容的提问来源于stack exchange,提问作者impatient_learner
相关产品推荐
相关产品推荐

