多表关联去重查询:同时统计客户订单与报价数量
解决多表关联统计时的重复计算问题
现有Customer(客户表)、Orders(订单表)、Quotes(报价表),每个客户可关联0条、1条或多条订单与报价记录。直接通过多表INNER JOIN同时统计订单和报价总数量时,会因笛卡尔积导致客户同时有订单和报价记录时数量被重复统计。以下是正确的单条SQL写法:
方法:子查询预统计后关联
先分别统计每个客户的订单、报价总数量,再与客户表关联,避免直接多表关联产生的重复计算:
SELECT c.CustomerName, COALESCE(o.TotalOrderQty, 0) AS TotalOrderQty, COALESCE(q.TotalQuoteQty, 0) AS TotalQuoteQty FROM Customer c LEFT JOIN ( -- 预统计每个客户的订单总数量 SELECT CustomerId, SUM(OrdQuantity) AS TotalOrderQty FROM Orders GROUP BY CustomerId ) o ON c.id = o.CustomerId LEFT JOIN ( -- 预统计每个客户的报价总数量 SELECT CustomerId, SUM(QuoteQuantity) AS TotalQuoteQty FROM Quotes GROUP BY CustomerId ) q ON c.id = q.CustomerId;
说明
- 子查询提前完成单表统计,避免多表关联时的笛卡尔积导致重复求和
- 使用
LEFT JOIN确保所有客户都能出现在结果集中,即使该客户没有订单或报价记录 COALESCE函数将NULL值替换为0,保证统计值的可读性
如果仅需要保留有订单或报价的客户,可将LEFT JOIN替换为INNER JOIN。
内容的提问来源于stack exchange,提问作者kaj66
相关产品推荐
相关产品推荐

