Office中国论坛/Access中国论坛

标题: 【Access小品】二指禅--等号的妙用 [打印本页]

作者: todaynew    时间: 2011-10-13 09:34
标题: 【Access小品】二指禅--等号的妙用
本帖最后由 todaynew 于 2011-10-13 14:04 编辑

  上个世纪八十年代,出了个海灯法师,其二指禅神功轰动一时。有好事者一番调查之后发现,和尚是假和尚,神功是假神功。不过至此以后果真有人苦练,竟然也可用两指倒立起来。科学界实际上也存在一个神秘的二指神功,那就是一个两根手指并成的等号,所有学科的发端,大体皆与这个符号有关。本文打算从Access中的一个小的运用,来揭示等号的高妙功力。

  版友wyj同志问了一个查询的问题,大意是统计某个省份的男女人数,我在查询中用了一个等号进行计算。版主群中聊天时红尘与悟道两同志说这个写法有点意思,于是想可能算是一个小的技巧,便觉得著文细致说道说道。

  假设有下面的这么一个表,想要按单位统计出男女人数。计算的方法有很多,可以分组查询或交叉查询进行计算。

单位        姓名        性别        籍贯        电话
单位1        张1        男        安徽        010-1234
单位2        张2        男        安徽        020-1235
单位3        张3        女        河南        010-1236
单位1        张4        男        河南        020-1237
单位2        张5        女        河南        020-1238
单位2        张6        男        山东        020-1239
单位1        张7        女        山东        010-1240
单位3        张8        男        山东        020-1241
单位1        张9        男        安徽        020-1242
单位1        张10      男        安徽        010-1243

  可以有这么个简单的算法:

select select 单位,-1*sum(性别="男") as 男,-1*sum(性别="女") as 女,count(*) as 总数
from tbname
group by 单位
  
  对初学者来说,猛然一看【性别="男"】有些疑惑,脑海中就在问这是个什么玩意?呵呵,其实很简单,这就是一个逻辑表达式,这个表达式的计算结果只有两个值,要么是-1(True,,表示等式成立),要么是0(False,表示等式不成立)。把所有逻辑值求和得到一个负数,将这个负数进一步计算成正数,就得到了男性的人数合计。

  推而广之,我们可以进一步按照这个思路,进行其他字段的分组计数。比如,可以写如下的SQL语句:

select select 单位,-1*sum(籍贯="安徽") as 安徽,-1*sum(籍贯="河南") as 河南,,-1*sum(籍贯="山东") as 山东,count(*) as 总数
from tbname
group by 单位

select select 单位,-1*sum(left(电话,3)="010") as 区号010,-1*sum(left(电话,3)="020") as 区号020,count(*) as 总数
from tbname
group by 单位

  也可以把所有这些计数查询写在一起,比如:

select select 单位,-1*sum(性别="男") as 男,-1*sum(性别="女") as 女,-1*sum(籍贯="安徽") as 安徽,-1*sum(籍贯="河南") as 河南,-1*sum(籍贯="山东") as 山东,-1*sum(left(电话,3)="010") as 区号010,-1*sum(left(电话,3)="020") as 区号020,count(*) as 总数
from tbname
group by 单位

  由此便可以继续想像,等号在这里并不是重要的,也可以是大于号小于号什么的,只要是构成逻辑表达式便可以按照这思路来进行分组的计数统计了。等号在这里就是两个根具有象征意义的手指,它轻轻的推开了一扇窗户,或者是捅破了一层薄纸。于是乎:“你看,多么蓝的天啊,走吧,走过去,你就会溶化在那蓝天里...”


作者: yanghua1900363    时间: 2011-10-13 11:29
很有趣 谢谢分享!
作者: yanwei82123300    时间: 2011-10-13 12:12
很有趣 谢谢分享!
作者: 轻风    时间: 2011-10-13 14:10
哦,原来其实说的不是等号,而是利用真/假类型的特性。这在EXCEL中也经常有妙用。
作者: wang1950317    时间: 2011-10-14 21:45
看todaynew 版主的帖子真有被融化进蓝天般舒服!
作者: ycxchen    时间: 2011-10-15 10:45
流畅的文采!




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