多表连接致聚合函数重复统计,求子查询解决方法
解决多表连接导致SUM重复统计的问题
问题根源
你遇到的Total_Revenue翻倍问题,核心原因是Table_3中同一个Order_ID对应多条记录。三表直接连接后,Table_1和Table_2的每一行数据会被重复匹配多次,最终SUM(b.price)会把同一个订单的Price累加多遍,导致结果偏大。
正确的子查询写法
写法一:先聚合Table_2再连接(推荐)
先在子查询中按Order_ID计算每个订单的总价,再和其他表连接,从根源避免重复统计:
SELECT a.product, SUM(b.order_total) AS Total_Revenue FROM Table_1 a JOIN ( -- 子查询先按订单ID聚合,得到每个订单的总价 SELECT order_id, SUM(price) AS order_total FROM Table_2 GROUP BY order_id ) b ON a.order_id = b.order_id JOIN Table_3 c ON a.order_id = c.order_id GROUP BY a.product
写法二:用EXISTS替代JOIN(如果不需要Table_3的字段)
如果Table_3只是用来过滤存在的订单,不需要它的其他数据,用EXISTS可以避免产生重复行:
SELECT a.product, SUM(b.price) AS Total_Revenue FROM Table_1 a JOIN Table_2 b ON a.order_id = b.order_id WHERE EXISTS ( SELECT 1 FROM Table_3 c WHERE c.order_id = a.order_id ) GROUP BY a.product
你之前写法的问题
你尝试的子查询没有按Order_ID分组,返回的是整个Table_2的总价,无法和单个Order_ID正确关联,所以统计结果无效。
内容的提问来源于stack exchange,提问作者ZigZag50
相关产品推荐
相关产品推荐

