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