设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2418|回复: 5
打印 上一主题 下一主题

[查询] 【查询答疑】浅谈那些被重复计算的数据

[复制链接]
跳转到指定楼层
1#
发表于 2017-5-19 11:08:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看一个问题:

在查询请假扣款时,工号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)



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2017-5-19 12:07:51 | 只看该作者
有指导意义!
3#
发表于 2017-5-19 14:46:21 | 只看该作者
有指导意义!经验之谈!赞
4#
发表于 2017-5-19 17:59:55 | 只看该作者
谢老师详细解答,让我又学到知识了!
5#
发表于 2017-5-20 06:22:39 | 只看该作者
学习学习
回复

使用道具 举报

6#
发表于 2017-5-24 07:35:38 | 只看该作者
本帖最后由 ly 于 2017-5-24 07:36 编辑

犹如庖丁解牛!希望有更多这样答疑案例讲解。谢谢roych 老师!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-30 22:28 , Processed in 0.109960 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表