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

多表关联去重查询:同时统计客户订单与报价数量

解决多表关联统计时的重复计算问题

现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:52:06