access2013 两个表汇总查询,为什么算出来的结果比实际大很多。怎么解决?

2024-12-21 21:24:25
推荐回答(1个)
回答1:

表与表进行连接后输出的总行数是两张表各自关联行数的笛卡尔乘积,这规则对于任何连接方式都是一视同仁的。对于这一点在涉及连接的情况下,统计汇总数要特别小心!


例如A表关联字段ID=1的行有2行,B表关联字段ID=1的行有3行,那么连接后ID=1的行将会有2x3=6行。


题主的"入库明细"和"出库明细"的每个"商品编码"下有多条记录这样连接后肯定要返回很多倍于原有记录的行数,对这样的结果集汇总,其汇总数自然要比实际数大很多,这也是导致统计数不正确的原因所在。


那么如何避免因笛卡尔乘积导致的汇总数不正确呢?解决办法有多种种,例如:一是在连接前就算好汇总数;二是使用union all; 三是确保至少一方表是唯一的情况下进行连接,这样连接后笛卡尔乘积输出规则不会导致输出行数的增加,因为1乘以任何数还是任何数; 。。。


题主这个统计输出比较复杂,用查询设计视图编写查询已经力不从心了,建议转到SQL设计视图进行查询设计。下面是使用UNION ALL的办法,它可以返回正确汇总数的SQL语句代码,供题主参考:

select t.商品编码,sum(t.rk) as 入库数量,
sum(t.ck) as 发货数量,sum(t.rk-t.ck) as 库存 from 
(select 商品编码,入库数量 as rk ,0 as ck from 入库明 
union all 
select 商品编码, 0,发货数量  from 出库明细) t  
group by t.商品编码;