Office中国论坛/Access中国论坛

标题: 【查询答疑】浅谈那些被重复计算的数据 [打印本页]

作者: roych    时间: 2017-5-19 11:08
标题: 【查询答疑】浅谈那些被重复计算的数据
我们先来看一个问题:
[attach]61236[/attach][attach]61261[/attach]
在查询请假扣款时,工号2和3明明是分别扣100,到了工资计算时,怎么就分别扣了200和300了呢?

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

[attach]61246[/attach]

不好意思,前面不小心删掉附件了,现在补上

作者: admin    时间: 2017-5-19 12:07
有指导意义!
作者: yanwei82123300    时间: 2017-5-19 14:46
有指导意义!经验之谈!赞
作者: kerxao    时间: 2017-5-19 17:59
谢老师详细解答,让我又学到知识了!
作者: ardu95    时间: 2017-5-20 06:22
学习学习
作者: ly    时间: 2017-5-24 07:35
本帖最后由 ly 于 2017-5-24 07:36 编辑

犹如庖丁解牛!希望有更多这样答疑案例讲解。谢谢roych 老师!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3