设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[Access本身] 这个查询句子哪错了

[复制链接]
跳转到指定楼层
1#
发表于 2020-4-11 22:39:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lingjiang 于 2020-4-11 22:55 编辑

肺活量分数: IIf([肺活量]>DMax("指数下限","肺活量评分","年级 & 性别='" [年级] & [性别2] & "'"),DLookUp("得分","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "' and 指数下限=" & DMax("指数下限","肺活量评分","年级 & 性别='" [年级] & [性别2] & "'")),DLookUp("得分","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "' and 指数下限=" & DMax("指数下限","肺活量评分","年级 & 性别='"[年级] & [性别2] & "' and 指数下限<=" & [肺活量])))

本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2020-4-11 22:49:14 | 只看该作者
如图所示

本帖子中包含更多资源

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

x
回复

使用道具 举报

3#
发表于 2020-4-12 02:31:36 | 只看该作者
恕我直言,实在没看懂你的意图是什么。但dlookup也好,dmax也好,都不是这样拼接的,原因在于,你原先的数据是数值型。以下给一段正确的多条件写法:
  1. DMax("指数下限","肺活量评分","年级='" & [年级] & "' and 性别='" & [性别2] & "'")
复制代码

这不是重点。重点是,你应该摒弃这种写法。原因有以下几个:
1、域函数效率低。
2、嵌套容易出错,这一点无需多说了吧?你在二楼的提示上已经看到了。
3、复杂关系很难处理。

为了得到这个结果,不得不创建3个中间查询。这就是我想告诉你的第4点:
参数表不能为了省事而只写几个临界点
以下是我写的参数表,看起来很笨重,几乎是从0开始到5000多,如果加上男/女,年级(大一到大四),大约是四万条左右。

当然,我们也可以根据最终成绩来减少一些参数,肺活量低于1000的比较少,所以把这部分数据删掉也无妨。当我们有了这几个参数,那么就可以根据这几个条件进行关联了:

最后得到的结果是这样的:

是的,有几个匹配不到。不过我们应该知道,这些超出范围的,必然是优秀级别的。为此,也可以加上iif手动处理下。例如:
计算得分: IIf(IsNull([得分]),100,[得分])
“等级”部分我就不处理了,你自己照葫芦画瓢吧。

我还想再多说几句:
1、这个参数表是否还有问题呢?答案是:有。
事实上,不太应该这样多字段关联的。根据数据库的设计范式,应该加上主键,例如,自动编号。而那张“大四”表也应该同时设置对应的索引,通过外键与这张参数表进行关联。这样的话才方便维护。但“大四”表并没有遵从数据库设计原则,而我恰好又比较喜欢偷懒,所以姑且这么做个查询吧。
希望在今后的日子里,去论坛多了解一下数据库的设计规范:
http://www.office-cn.net/thread-118819-1-1.html
2、参数表照旧能不能处理?答案是:能。但通常需要使用ADO或者DAO等VBA程序来处理,这可能不是一个最佳解决方案。而且我觉得,对于新手来说,有必要先去了解表设计规范,而不是一上来就想着把这一切交给VBA。毕竟表设计规范的话,根本不需要太多的VBA;相反,表设计不规范,写很多VBA也未必能解决设计缺陷所带来的bug,到时候左支右绌,乃至于推翻重来。
最后奉上附件:




本帖子中包含更多资源

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

x
4#
 楼主| 发表于 2020-4-12 11:32:37 | 只看该作者
本帖最后由 lingjiang 于 2020-4-12 12:34 编辑

谢谢您,关于这内部的表是这样的,大四表是参照表,是我进行运算较对的。体重指数评分和肺活量评分是成绩取值范围表,如一个人肺活量吹3000,就要对照肺活量评分按性别来查得分和等级。说白一些就是查表求结果。因为我初学所以向别人要了大四这个表作为参照,以便查看是否正确,目前就发现用此法每次到了低于最低标准时是会出错,例如:体重指数为小于17.8的应为低体重,结果出现了一个16直接就变成了错误!!!!只好加了0到10的取值范围,
另外,这方法也是从本论坛一个学生成绩等级评定启发来的
语法如下:体重指数(BMI)分数: IIf([体重指数]>DMax("指数下限","体重指数评分","性别='" & [性别2] & "'"),DLookUp("得分","体重指数评分","性别='" & [性别2] & "' and 指数下限=" & DMax("指数下限","体重指数评分","性别='" & [性别2] & "'")),DLookUp("得分","体重指数评分","性别='" & [性别2] & "' and 指数下限=" & DMax("指数下限","体重指数评分","性别='" & [性别2] & "' and 指数下限<=" & [体重指数])))
肺活量如下
肺活量分数2: IIf([肺活量]>DMax("指数下限","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "'"),DLookUp("得分","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "' and 指数下限=" & DMax("指数下限","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "'")),DLookUp("得分","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "' and 指数下限=" & DMax("指数下限","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "' and 指数下限<=" & [肺活量])))
前提所有指数下限的数据类型必须是数字
5#
发表于 2020-4-12 11:49:10 | 只看该作者
roych 发表于 2020-4-12 02:31
恕我直言,实在没看懂你的意图是什么。但dlookup也好,dmax也好,都不是这样拼接的,原因在于,你原先的数 ...

老师的参数表有点大,如果某个指标的标准有变动,修改起来也要费些神了
6#
发表于 2020-4-12 14:40:53 | 只看该作者
ly 发表于 2020-4-12 11:49
老师的参数表有点大,如果某个指标的标准有变动,修改起来也要费些神了

如果起点是2300的肺活量,每增加40,分数则加10分。在“大四”的记录表上先对数据进行处理也不难。
问题在于这并非线性关系,所以具体到每一个值,也是无奈之举。好在大致范围划定后,一般不会有太大变化。
对于多套指标,其实我们可以做多个表来处理的。
事实上,宽表并不符合数据库设计原则,不适合作为底层。
作为底层的话,这张表应该是拆开一张学生信息表,一张成绩表,通过学号关联起来,还可以加上考核项目作为索引。一张考核标准表等等。
7#
发表于 2020-4-12 19:32:54 | 只看该作者
最终改造版本请留意以下帖子:
http://www.office-cn.net/thread-126431-1-1.html
8#
 楼主| 发表于 2020-4-14 22:51:32 | 只看该作者
学习了,您的做法和从机器中必体质数据差不多,很有启发。另外国家体质的标分表是有标准的分数段就是那些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 04:23 , Processed in 0.090937 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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