|
昨天闲着无聊,便到论坛上拔下草,发现有版友问及查询的问题(原文在这里):
肺活量分数: IIf([肺活量]>DMax("指数下限","肺活量评分","年级 & 性别='" [年级] & [性别2] & "'"),DLookUp("得分","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "' and 指数下限=" & DMax("指数下限","肺活量评分","年级 & 性别='" [年级] & [性别2] & "'")),DLookUp("得分","肺活量评分","年级 & 性别='" & [年级] & [性别2] & "' and 指数下限=" & DMax("指数下限","肺活量评分","年级 & 性别='"[年级] & [性别2] & "' and 指数下限<=" & [肺活量])))
一看这个辣眼睛的SQL语句,我当时就蒙圈了。这么复杂的语句,实话说,我自己也不敢担保写出来能不能运行。事实上,我也没完全看明白。不过根据语句意思,我理解的理解是这样:
例如,大四男生的肺活量,5000是100分,4800是90分。如果考生的成绩是5500,那毫无疑问是满分了;如果是4832,则还是90分。
像上面的例子,4832并不在肺活量评分表里,你只能先去表里寻找不超过4832的最大值【即4800】,然后再根据4800去匹配成绩等级。于是就有了前面dmax套上dlookup的写法。
从思路来看,似乎没什么问题。但实际操作中,很容易出现各种问题。例如,假设大四男生的肺活量是2300-5000,那么低于2300的必然找不到,该如何处理?而且域函数的效率本身已经很低了,还嵌套这么多层,真的好吗?有其它解决方法吗?
其实我在该帖子的回帖里已经给出了至少两种方法(VBA部分,暂时先不提)。
一种是在原基础上通过多个中间查询最后得到结果;另一个是重构参数表,将离散变量转为连续变量,与成绩表中的离散数据进行关联匹配。
其中第二个方法,引发了另一个版友的讨论,这参数表是否太大了?一旦调整参数,是否需要插入更多的数据?为此,我决定根据表设计范式重新处理它。准备作为一个系列来讲解,希望新手看完,能对表设计理论加深理解。
这里先给出源文件,大家也可以思考下,这个表该如何改造。
【新手入门】之一:If分支语句
【新手入门】之二:分支语句总结
【新手入门】之三:循环语句For
【新手入门】之四:循环语句Do和死循环
【新手入门】之五:公共变量与传址过程、传值过程
【新手入门】之六:“悲欢离合总无情”——浅谈Split和Join
【新手入门】之七:嵌套与并列——再谈If流程问题
【新手入门】之八:“连就连”——浅谈“&”和“+”连接符的区别
【新手入门】之九:从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问
【新手入门】之十:书到用时方恨少——自定义菜单(Access 2003)的制作
【新手入门】之十一:浅谈ADO之序言
【新手入门】之十二:浅谈ADO之Connection
【新手入门】之十三:浅谈ADO之Conmmand(上)
【新手入门】之十四:浅谈ADO之Command(下)
【新手入门】之十五:浅谈ADO之Recordset(上)
【新手入门】之十六:浅谈ADO之Recordset(下)
【新手入门】之十七:浅谈列表框的使用
【新手入门】之十八:双击列表框修改数据
【新手入门】之十九:从“书与女友恕不外借”谈起——浅谈“Bookmark”的使用
【新手入门】之二十:“书与书签”——bookmark属性答疑
【新手入门】之二十一:记录集的“凌迟”——逐条导出记录集
【新手入门】之二十二:分组行号
【新手入门】之二十三:“富则妻妾成群”——浅谈一对多录入数据
【新手入门】之二十四:查询的大型翻车现场——再谈表设计范式(之一)
【新手入门】之二十五:查询的大型翻车现场——再谈表设计范式(之二)
【新手入门】之二十六:查询的大型翻车现场——再谈表设计范式(之三)
【新手入门】之二十七:查询的大型翻车现场——再谈表设计范式(之四)
【新手进阶】之一:基础算法(一)
【新手进阶】之二:基础算法(二)
【新手进阶】之三:基础算法(三)
【新手进阶】之四:基础算法(四)
【新手进阶】之五:排序搜索(一)
【新手进阶】之六:排序搜索(二)
【新手进阶】之七:递归算法
【新手进阶】之八:冒泡排序
【新手进阶】之九:浅谈不绑定数据源操作记录
【新手进阶】之十:工作日的计算
【新手进阶】之十一:“庖丁解牛”和“纪昌学射”——浅谈表格式文本数据的导入
【新手进阶】之十二:从四脚腾空的奔马谈起——原来界面可以这样设计
【新手进阶】之十三:Outlook风格导航界面
【新手进阶】之十四:仓库管理系统【新手进阶】之十五:你可能遇到了一个假的标签效果
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|