我们先来看一个问题:
在查询请假扣款时,工号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)