选择查询
【查询答疑】浅谈那些被重复计算的数据
2017-05-20 17:16:06

我们先来看一个问题: 在查询请假扣款时,工号2和3明明是分别扣100,到了工资计算时,怎么就分别扣了200和300了呢?为了查清楚问题的真相,我们先分解下。首先看看请假扣款查询是否存在问题:

查看设计视图,用表达式来求和,显然是OK的。既然问题不在这里,那么我们继续下一步,查看工资查询的问题: 显然,主表除了联接请假表之外,还直接联接了2个表。一个是底薪表,另一个则是计件工资部分。我们继续拆解,看看底薪表有没有问题: 表面上看,底薪表跟人事表的底薪类别存在一对多的关系,但是考虑到每个员工只有一个底薪类别,所以可以视为一对一的关系。也就是说,因此这个表的重复计算也可以排除了。剩下的就两个表了:加班表和工序工费表。我们来看看这两个表到底是什么情况: 这个工号1的计件工资是110元。这个显然是没问题的。细心的你,肯定发现问题在哪里了。不错,我们回头看看前面那个表: 工号1的计件工资怎么变成220元了?这显然是在这两个表的联接过程中存在重复计算的问题了。为什么会这样呢?我们知道,计件工资里只有一条记录……显然问题不在计件工资里,那么在哪里呢?而且又不在底薪表里(前面我们分析过了),所以,我们可以很肯定地说,问题出现在请假表里,我们回头再看看: 果然,工号1请假了2天……这就很好解释了。由于请假2天,所以计件工资也给他计算了2次。现在,我们可以来讨论下解决方案了:请假表或者加班表,至少选择一个作为合计查询,以便得到唯一值,否则就会产生笛卡尔乘积:简单点说,就是:A表有n条记录,B表有m条记录,会产生n×m条结果。这里就不再赘述这个查询怎么做了。详细见附件。最后,给新手一点建议:1、建议所有新手都看看本文。如果没空看完全文,请看第2点。2、多个表做联接查询时,如果含有聚合函数(sum、count等等)时,尽可能保证主表与子表的关系是一对一关系。如果不能全部做到,最多只保留一个一对多关系。本例就是只保留一个一对多关系(详细请留意查询:工资汇总和工资汇总2)