Office中国论坛/Access中国论坛

标题: 这个查询句子哪错了 [打印本页]

作者: lingjiang    时间: 2020-4-11 22:39
标题: 这个查询句子哪错了
本帖最后由 lingjiang 于 2020-4-11 22:55 编辑

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

作者: lingjiang    时间: 2020-4-11 22:49
如图所示

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

这不是重点。重点是,你应该摒弃这种写法。原因有以下几个:
1、域函数效率低。
2、嵌套容易出错,这一点无需多说了吧?你在二楼的提示上已经看到了。
3、复杂关系很难处理。
[attach]63708[/attach]
为了得到这个结果,不得不创建3个中间查询。这就是我想告诉你的第4点:
参数表不能为了省事而只写几个临界点
以下是我写的参数表,看起来很笨重,几乎是从0开始到5000多,如果加上男/女,年级(大一到大四),大约是四万条左右。
[attach]63709[/attach]
当然,我们也可以根据最终成绩来减少一些参数,肺活量低于1000的比较少,所以把这部分数据删掉也无妨。当我们有了这几个参数,那么就可以根据这几个条件进行关联了:
[attach]63710[/attach]
最后得到的结果是这样的:
[attach]63711[/attach]
是的,有几个匹配不到。不过我们应该知道,这些超出范围的,必然是优秀级别的。为此,也可以加上iif手动处理下。例如:
计算得分: IIf(IsNull([得分]),100,[得分])
“等级”部分我就不处理了,你自己照葫芦画瓢吧。

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




作者: lingjiang    时间: 2020-4-12 11:32
本帖最后由 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 指数下限<=" & [肺活量])))
前提所有指数下限的数据类型必须是数字

作者: ly    时间: 2020-4-12 11:49
roych 发表于 2020-4-12 02:31
恕我直言,实在没看懂你的意图是什么。但dlookup也好,dmax也好,都不是这样拼接的,原因在于,你原先的数 ...

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

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




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