荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店