- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
group by 分组
group by 分组
第五节 group by分组的应用
首先先说说分组是怎样工作的。举个例子:
表:temp1有以下记录:
bh sl
aaa 1
aaa 4
ccc 2
bbb 5
aaa 9
bbb 7
现在要统计一下temp1有中多少种编号,各种编号的总数量又是多少。很明显,这是使用分组。
sele bh,sum(sl) as total_sl ;
from temp1 ;
grou by bh ;
orde by bh ;
into curs temp2
命令的运行过程就象投票选举中的点票过程一样。它中间到底是采用什么样的技术来储存中间结果我不知道,但不这重要,我现在假设它使用临时表(实际上我想不大可能),这样对结果没影响,但又容易理解。
1、是逐个扫描记录。每遇到一个新的编号,就为这个编号建立一个临时表(再次重申,使用临时表只是我的假设布局,真正的处理方法我不知道),然后把这个记录的内容放进对应的临时表中去。如果不是新编号,就直接把记录内容放进对应的临时表中去。
2、全部记录扫描完了,各种编号对应的临时表也产生了,现在就是对每一个临时表采用sum()进行统计了。比如编号为aaa的临时表是cursor1,那它的内容就是:
Aaa 1
Aaa 4
Aaa 9
现在进行sum()统计了,它的效果就相当于sele bh,sum(sl) as total_sl from cursor1。每一个编号的临时表都要进行这样的sum()统计,然后把每个编号的统计结果联合起来,就想使用union一样,最后得出的结果就是:
aaa 14
ccc 2
bbb 12
3、然后再给bh排序,结果就是:
aaa 14
bbb 12
ccc 2
看了上面那个例子,再看下面这条命令,想必也可以理解了吧:
sele cpk.cpbh,cpk.cpmc,sum(iif(isnull(thdmx.thsl),0,thdmx.thsl) as total_thsl ;
from cpk left join thdmx ;
on cpk.cpbh=thdmx.cpbh ;
grou by cpk.cpbh ;
orde by cpk.cpbh ;
into curs temp1
产品表左联接提货明细表,这样没有提过的产品,在联接后的临时表中,对应的提货数量就是个null值。到了分组,第一步完成后,生成的临时表中也仍然有null值,所以在第二步进行sum命令时,就要使用iif(isnull())来过滤了。过滤的结果就是把null值改为0,其它的不变,然后再由sum进行汇总。最后第三步再排序,结果就出来了。
以上是分组的最基本用法。现在说说分组的一些古怪用法。
一、使用recn()。例子一:
有种情况,一大段本来是应该连续的号码,但中间地漏掉了一些号码,现在要把这些漏了的号码找出来。恐怕很多人,一来就是使用scan endscan,再加上一些中间变量以作为判断依据,最后写成的代码有一大段,运行起来慢得要死。但如果采用以下这种方法,我想即使它不是最好,但也是很好的了。数据如下:
1、6、3、5、2、7、9、10、15、16
在这些数据当中,要找出漏掉了的4、8、11、12、13、14。
1、首先排序
sele bh from temp1 orde by bh into curs temp1
结果是:
1、2、3、5、6、7、9、10、15、16
如果源表中的物理记录顺序和号码的顺序一样就不用做这一步了。
2、取temp1中各个记录的recn(),即记录号,然后把编号减去记录号
sele bh,val(bh-recn()) as aa from temp1 into curs temp2
结果就是:
Bh aa
1 0
2 0
3 0
5 1
6 1
7 1
9 2
10 2
15 6
16 6
3、对aa使用分组,取每组中最小的bh和最大的bh
sele min(bh) as minbh,max(bh) as maxbh from temp2 grou by aa into curs temp3
结果如下:
minbh maxbh
1 3
5 7
9 10
15 16
4、现在结果很明显了,某个记录的minbh跟它上面那个记录的maxbh中间相差的,就是漏掉的号码。现在才使用scan endscan就容易了。
以上方法适用于数据量大、第三步的结果比源表少很多记录的情况下才会发挥效果。因为scan的速度不能和Select - SQL相比,何况它还要作条件判断。虽然这种方法使用了二条全遍历的SQL命令,但这是没过滤条件的SQL命令,速度是很快的,只是分组要多点时间而已。同时只适用于编号没有重复的情况。如果编号有重复,那在第一
您可能关注的文档
- David Cole企业培训:全视线耐心培育市场.doc
- David Cole:全视线耐心培育市场.doc
- day2-OC基础2.doc
- dB,dBm,dBi,dBd,dBc,dBw的含义.doc
- db2操作大全.doc
- DBA字典.doc
- DBISAM与BDE的不同之处.doc
- DBZ4出招表.doc
- DBX声明书.doc
- DCS在600t_d水泥干法窑生产线的应用.doc
- springbooot+vue基于java的房屋维修系统毕业论文.doc
- 中国消防救援学院《单片机系统实验》2023-2024学年第一学期期末试卷.doc
- 2025年溧阳纺织化学品项目申请.pptx
- 景区门票包销合同模板(3篇).docx
- 【股票技术指标学习指南】第七章第三节货币需要量的测算.doc
- 2025春 _ 人教版七年级英语下册【unit4】看音标写单词.doc
- 2025春 _ 人教版七年级英语下册【unit5】看音标写单词.doc
- 2025春 _ 人教版七年级英语下册【unit6】看音标写单词.doc
- 2025春 _ 人教版七年级英语下册【unit7】看音标写单词.doc
- 2025春 _ 人教版七年级英语下册【unit8】看音标写单词.doc
文档评论(0)