问题5
求按登记注册类型多个层次划分的单位个数小计和总计
例如要得出如下的结果:
代码
登记注册类型
家数
------ ---------------------------------------
---------
100
内资企业
61920
110
国有企业
1365
140
联营企业
476
141
国有联营企业
52
...
200
港、澳、台商投资企业
9004
210
合资经营企业(港或澳、台资)
4454
220
合作经营企业(港或澳、台资)
556
300
外商投资企业
11396
310
中外合资经营企业
5070
320
中外合作经营企业
663
我们有3种方法,都可以完成任务。
方法1
select code 代码 , substrb('
',1,item_level*2-2)||b.reg_type 登记注册类型, cnt 家数
from
(
(select substr(z01_08,1,1)||'00' code ,count(*)
cnt
from cj601
group by substr(z01_08,1,1))
union
(select substr(z01_08,1,2)||'0' code ,count(*)
cnt
from cj601
group by substr(z01_08,1,2))
union
(select substr(z01_08,1,3) code ,count(*)
cnt
from cj601
group by substr(z01_08,1,3))
)
c, djzclx b where c.code=b.reg_code;
方法2
select code 代码 , substrb('
',1,item_level*2-2)||b.reg_type 登记注册类型, cnt 家数
from
(
select
case when code3 is not null then
code3
when code2<>'0' then code2
else code1
end code,cnt from (
select substr(z01_08,1,1)||'00' code1 , substr(z01_08,1,2)||'0'
code2 , substr(z01_08,1,3) code3 ,count(*) cnt
from
cj601
group by
rollup(substr(z01_08,1,1),substr(z01_08,1,2),substr(z01_08,1,3))
) where code2<>code3 or code3 is null and
code1<>'00'
)
c, djzclx b where c.code=b.reg_code
order by 1
;
方法3
select code 代码 , substrb('
',1,item_level*2-2)||b.reg_type 登记注册类型, cnt 家数
from
(
select
case when code3 is not null then
code3
when code2<>'0' then code2
else code1
end code,cnt from (
select substr(z01_08,1,1)||'00' code1 , substr(z01_08,1,2)||'0'
code2 , substr(z01_08,1,3) code3 ,sum(cnt) cnt
from
(select substr(z01_08,1,3) z01_08,count(*) cnt from cj601 group by
substr(z01_08,1,3))
group by
rollup(substr(z01_08,1,1),substr(z01_08,1,2),substr(z01_08,1,3))
) where code2<>code3 or code3 is null and
code1<>'00'
)
c, djzclx b where c.code=b.reg_code
order by 1
;
上述3种写法都能得出正确的结果,但执行效率有巨大差别,第一种写法最简单,但是使用union要对cj601作了3遍全表扫描,执行效率最低,第2种写法对cj601做rollup分组,让数据库自动求小计和总计,第3种写法先对cj601做分组汇总,对结果集再做rollup分组,让数据库求小计和总计,在数据量中等的时候效率差不多,数据量大的时候,方法3效率更好些,因为rollup分组要处理的记录数更少,而rollup分组比普通分组开销大一些。
Oracle提供的分析函数一共有10多个,但有些专门的统计函数比如求标准差,相关系数,协方差等我们一般用不到,主要用到的是本文提到的RANK,
lead,
ratio_to_report等,我们如果能够将它们和decode函数,case语句配合,善加利用,就能编写出执行效率高的汇总语句,高效完成统计数据处理任务。更加详细的关于分析函数的信息,请参考资料Oracle9i
Data Warehousing Guide 第19章SQL for Analysis in Data
Warehouses。
分享到:
相关推荐
oracle的分析函数汇总oracle的分析函数汇总
oracle 内置函数大全
oracle sql内置函数大全
Oracle SQL 内置函数大全 SQL中的单记录函数 给出整数,返回对应的字符 连接两个字符串 增加或减去月份 用于对查询到的结果进行排序输出
Oracle 内置函数PPT,可以方便查询Oracle内置函数,为开发人员的好助手。
Oracle内置函数大全,一般地,日期格式说明符是不太敏感的。然而,当为了显示而说明日期格式、对于文本数据中的说明符等情况下,它就变得比较务实、具体了
Oracle_SQL_内置函数大全 Oracle内置函数大全
ORACLE 分析函数大全,包含很多关于ORACLE的分析函数,内置函数
ORACLE常用分析函数说明,oracle优化
Oracle内置SQL函数-分类整理大全 ---------------------------------------------------- From: lihaichen http://blog.oracle.com.cn/?uid/19500 Oracle内置SQL函数-分类整理大全 1 F.1字符函数——返回字符值 ...
文档详细介绍了oracle的分析函数,包括功能说明、sql示例等。分析函数功能强大,在报表或数据迁移的时候可能会使用到。分析函数用法看上去有点复杂,最好使用的时候,参考文档
oracle函数大全,介绍ORACLE一些 常用函数
分析函数2(Rank, Dense_rank, row_number);分析函数3(Top/Bottom N、First/Last、NTile);窗口函数;报表函数;分析函数总结;26个分析函数;PLSQL开发笔记和小结;分析函数简述 ROW_NUMBER () OVER([partition_clause]...
Oracle内置SQL函数-分类整理大全Oracle内置SQL函数-分类整理大全
涵盖了oracle中所有的内置函数,可随搜随用,也供初学者学习使用。
Oracle内置SQL函数-分类整理大全
分析函数是 Oracle 专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计。本文总结了若干分析函数的使用方式,供大家学习参考,有...
ORACLE分析函数大全 包括大部分常用的分析函数
oracle 内置sql函数 ,内置函数详细说明,