设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2729|回复: 2

[查询] 【Access小品】两个联接问题的处理

[复制链接]
发表于 2015-7-28 17:30:04 | 显示全部楼层 |阅读模式
本帖最后由 todaynew 于 2015-7-28 17:57 编辑

  前日里为一版友解决中位数问题,曾写《入乡随俗》一文,在该文中对中位数采用自定义函数方式处理。这种方法存在一个问题,就是当Access做后台时,其中的查询如果调用自定义函数的话,那么数据是无法在前台读出来的。究其原因大概是Access不像SQL SERVER可以提供数据库服务,它不能自动运行后台的程序和自定义函数。由于这样的一个原因,就需要采用SQL语句来直接编写后台的查询,以便前台的调用。

  中位数是指一组数据由小到大排序后,如果记录条数为奇数则取其中间位置的数据,如果为偶数则取中间两数的平均数。编写中位数查询还是有一些难度的,其难度有二:其一是如何统一记录条数为奇数和偶数的算法,也就是一个算式要同时满足两种情况的运算;其二是如何进行高效率的运算。

  为了简化中位数查询的SQL语句,我们可以先编写一个“编号查询”。这个查询中我们解决两个问题,其一是对记录按照分组编出序号;其二是我们设计两个中位数位置。如果记录条数为偶数,比如6条记录,那么有两个中位数分别处于3和4。问题在于当记录条数为奇数时,比如7条记录,中位数处于4,只有一个中位数位置。为了统一中位数算法,我们可以将奇数条数的中位数也看成有两个,也就是两条处于4位置的记录。这样的话,我们就都可以用两条记录的平均数来计算中位数了。为了求出位置一,我们利用了Access中逻辑值的特性(0,-1),这是一个常用的奇巧的算法。由此我们为解决中位数计算的第一个难题做好了准备。

  关于第二个难题是计算效率问题,中位数的处理我们可以有多种方法。其中比较容易想到的是在字段上编写子查询或用域函数,但这样的处理运算速度非常慢。比较好的处理时采用联接的方式编写。由此我们可以编写“中位数查询”,在这个查询中,我们用一个分组查询与两个“编号查询”联接,这样就得到了计算中位数的两个值,将这两个值平均一下,也就得到了对应的中位数了。


  另外一个关于联接的问题也有点意思。有一个版友给了这样一组数据:

县市           乡镇
衡阳县        湖南张家界市
临湘市        湖南省岳阳地区岳阳市
湘潭县        湖南衡阳县西渡镇
岳阳市        中国湖南湘潭县易俗河镇

  其希望处理后得到如下结果:

县市           乡镇
岳阳市        湖南省岳阳地区岳阳市
衡阳县        湖南衡阳县西渡镇
湘潭县        中国湖南湘潭县易俗河镇

  这个问题看起来复杂,其实如果用联接的方式处理也十分简单,这个查询中的关键部分在于ON子句的写法,这个写法采用的是逻辑表达式,而不是关系表达式。关于这个问题,可以参见《三层功夫》中的论述。

示例:

视图:

本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

发表于 2015-7-28 22:29:19 | 显示全部楼层
收藏。。。。。。。。。谢谢分享。
发表于 2016-8-20 11:03:36 | 显示全部楼层
已经下载学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 04:00 , Processed in 0.082273 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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