荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: huanghm (东方不败), 信区: Database
标 题: Oracle数据库中按组距分组交叉汇总的方法
发信站: BBS 荔园晨风站 (Tue Jun 2 05:43:49 1998), 转信
我们在日常工作中,时常会碰到一些按组距分组进行
交叉汇总制表的情况,这时就不免需要编写汇总程序,准
备制表数据。而汇总方法的制定,对于汇总程序的编写以
及数据库汇总的效率尤其重要,这在数据库极其庞大,如
一些统计数据库,数据量达到几百万条记录、数据容量达
到几个GB或者更大时表现得尤为突出。
下面以基本单位数据库汇总中较为常见的一种汇总表
作为实例,来说明按组距分组交叉汇总的几种方法。所有
汇总程序均用标准SQL语言编写,虽然是在Oracle数据库
下调试通过,但汇总方法及汇总程序对所有支持标准SQL语
言的数据库都是适用的。
在基本单位数据库中有一张基层表,表名设为dwk,
其表结构为:
frdm varchar2(12) ——单位法人代码,数据库Pri
mary Key
dwmc varchar2(40) ——单位名称
jjlx varchar2(2) ——经济类型,值为10(国有经
济)、20(集体经济)、30(个体经济)等
cyrs number(12) ——从业人数,值为单位从业人
员总数
con number(1) ——汇总标识,值为1,用于对
单位总数进行汇总
……
现需根据基层表dwk汇总出按经济类型、从业人员规
模(其分组假设为:cyrs<=1000、1000 10000)分组的单位分布情况,也就
是说,汇总结果表示将如下表:
按经济类型、从业人员规模分组的单位数分布情况表
小于1000人 大于1000人 小于5000人
大于5000人小于10000人 大于10000人
10(国有)
20(集体)
30(个体)
……
要完成这项汇总,主要有三种方法。现假设汇总结果
将存于结果表hzb中,hzb结构如下:
dm varchar2(2) ——存放经济类型代码
z1 number(12) ——存放小于1000人的单位总数
z2 number(12) ——存放大于1000小于5000人的
单位总数
z3 number(12) ——存放大于5000小于10000人的
单位总数
z4 number(12) ——存放大于10000人的单位总数
在汇总过程中若要用到临时表如sumtmp1、sumtmp2、
sumtmp3……其结构如同hzb。
方法一:临时表合并
在这种方法中,需要用到较多临时表,一般来说,组
距分组有几个分项,至少需要几个临时表。先对各分项进
行汇总,结果存入临时表,然后对临时表进行连接,生成
最终结果。
汇总程序如下:
insert into sumtmp1(dm,z1)
select dm,sum(con) from dwk where cyrs<=1000;
insert into sumtmp2(dm,z2)
select dm,sum(con) from dwk where cyrs>1000 an
d cyrs<=5000;
insert into sumtmp3(dm,z3)
select dm,sum(con) from dwk where cyrs>5000 an
d cyrs<=10000;
insert into sumtmp4(dm,z4)
select dm,sum(con) from dwk where cyrs>10000;
insert into hzb(dm,z1,z2,z3,z4)
select sumtmp1.dm,sumtmp1.z1,sumtmp2.z2,sumtmp
3.z3,sumtmp4.z4
from sumtmp1,sumtmp2,sumtmp3,sumtmp4
where sumtmp1.dm=sumtmp2.dm and sumtmp1.dm=sum
tmp3.dm and
sumtmp1.dm=sumtmp4.dm;
方法二:临时表汇总
在这种方法中,只需要一个临时表,将组距分组各分
项分别汇总到一个临时表中,再对临时表进行汇总,得出
最终汇总结果。
汇总程序如下:
insert into sumtmp1(dm,z1)
select dm,sum(con) from dwk where cyr
s<=1000;
insert into sumtmp1(dm,z2)
select dm,sum(con) from dwk where cyr
s>1000 and cyrs<=5000;
insert into sumtmp1(dm,z3)
select dm,sum(con) from dwk where
cyrs>5000 and cyrs<=10000;
insert into sumtmp1(dm,z4)
select dm,sum(con) from dwk where
cyrs>10000;
insert into hzb(dm,z1,z2,z3,z4)
select dm,sum(z1),sum(z2),sum(z3),sum
(z4)
from sumtmp1
group by dm;
方法三:使用decode
和sign函数(Oracle数据库函数)
在这种方法中,使用了Oracle数据库提供的两个函数
:decode(用于等值比较,如decode(a,b,c,d)表示:若a=
b,则函数返回c;否则返回d)和sign(用于判断大小,如s
ign(a,b)表示:若a>b,则函数返回1;若a=b,则函数返
回0;若a ,也不需要对数据库进行多次汇总,可一次直接得出汇总
结果。
汇总程序如下:
insert into hzb(dm,z1,z2,z3,z4)
select dm,sum(decode(sign(cyrs-1001),
-1,con,0),
sum(decode((sign(cyrs-1000)-sign(c
yrs-5001)),2,con,0),
sum(decode((sign(cyrs-5000)-sign(c
yrs-10001)),2,con,0),
sum(decode(sign(cyrs-10000), 1,con,
0)
from dwk
group by dm;
--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.25]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店