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
相关产品推荐
相关产品推荐

