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

Access 2013三表关联查询Sum/Count结果翻倍问题求助

解决Access查询中聚合数值翻倍的问题

嗨,这个问题我太熟悉了——你遇到的是多表左连接产生笛卡尔积导致的统计值异常!当一个零件在tbl_Customer_Back_Order有N条记录,同时在tbl_On_Order有M条记录时,直接连接这两个表会生成N×M条重复记录,你的COUNT和SUM自然就会变成原来的M倍或N倍,这就是数值翻倍(甚至更多)的原因。

解决方案:用子查询预先聚合数据

我们需要先对两个子表分别做聚合统计,确保每个零件号在子查询中只有一行结果,再和主表tbl_Inventory_Master做左连接,这样就不会产生笛卡尔积了。

以下是修改后的完整SQL语句:

SELECT 
    I.Inventory_Part_Num, 
    I.Description, 
    I.On_Hand_Stock, 
    Nz(B.Back_Order_Count, 0) AS Back_Order_Count, 
    Nz(B.BO_Qty, 0) AS BO_Qty, 
    Nz(O.Late_Deliveries_Count, 0) AS Late_Deliveries_Count, 
    Nz(O.Late_Qty, 0) AS Late_Qty
FROM 
    tbl_Inventory_Master AS I
    LEFT JOIN (
        -- 预先统计每个零件的欠货记录数和总数量
        SELECT Part_Number, COUNT(*) AS Back_Order_Count, SUM(Back_Order_Qty) AS BO_Qty
        FROM tbl_Customer_Back_Order
        GROUP BY Part_Number
    ) AS B ON I.Inventory_Part_Num = B.Part_Number
    LEFT JOIN (
        -- 预先统计每个零件的逾期交货记录数和总数量
        SELECT Part_Number, COUNT(*) AS Late_Deliveries_Count, SUM(Order_Qty) AS Late_Qty
        FROM tbl_On_Order
        WHERE Due_Date < [ENTER TODAYS DATE IN FORMAT DD/MM/YYYY]
        GROUP BY Part_Number
    ) AS O ON I.Inventory_Part_Num = O.Part_Number
WHERE 
    I.Customer_Code = '274'
GROUP BY 
    I.Inventory_Part_Num, 
    I.Description, 
    I.On_Hand_Stock,
    B.Back_Order_Count,
    B.BO_Qty,
    O.Late_Deliveries_Count,
    O.Late_Qty

关键调整说明

  • 子查询聚合:先在子查询里完成COUNT和SUM,每个零件号只返回一行统计结果,避免连接时的重复计算
  • Nz()函数处理NULL:当某个零件没有欠货或逾期记录时,左连接会返回NULL,用Nz()把这些NULL转换成0,统计结果更直观合理
  • 调整逾期条件位置:把Due_Date < ...放到逾期统计的子查询里,而不是主查询的WHERE子句——如果放在主查询里,会把左连接变成内连接,丢失那些没有逾期但有欠货的零件记录

内容的提问来源于stack exchange,提问作者Alan Hunter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:34