`
hypgr
  • 浏览: 276953 次
社区版块
存档分类
最新评论

利用Oracle内置分析函数进行高效统计汇总(2)

阅读更多

问题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内置SQL函数-分类整理大全.doc

    ### Oracle内置SQL函数-分类整理大全 #### F.1 字符函数——返回字符值 **1.1.1 CHR** - **语法**: `CHR(x)` - **功能**: 返回在数据库字符集中与`x`拥有等价数值的字符。`CHR`和`ASCII`是一对反函数,即经过`CHR...

    Oracle内置SQL函数-分类整理大全

    本文将深入探讨Oracle内置的SQL函数,这些函数极大地丰富了数据查询、处理和分析的能力。 一、数学函数 Oracle提供了丰富的数学函数,如ROUND、TRUNC、MOD、SQRT等。ROUND用于四舍五入,例如ROUND(123.456, 2)将...

    Oracle内置SQL函数

    Oracle数据库系统是世界上最广泛使用的数据库管理...通过熟练掌握这些Oracle内置的SQL函数,开发者可以更高效地处理和管理数据库中的数据。在sqlplus环境中,可以编写脚本文件并执行,实现自动化操作,提高工作效率。

    oracle分析函数指南

    Oracle分析函数是数据库查询中的重要工具,主要用于处理复杂的聚合和排序操作,特别是在OLAP(在线分析处理)系统中,它们能够高效地进行数据汇总和分析。分析函数与聚合函数(如SUM, AVG, COUNT等)有所不同,聚合...

    oracle最全函数大全

    ### Oracle 最全函数大全 #### 一、总体介绍 ...分析函数特别适合处理复杂的数据分析任务,而聚合函数则是进行统计分析的基础。掌握这些函数能够帮助开发人员更加高效地管理和操作数据库中的数据。

    ORACLE的内置函数

    Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,其强大的功能和高效的数据处理能力离不开丰富的内置函数。这些函数在SQL查询、数据处理、计算以及各种复杂的业务逻辑中起着至关重要的作用。下面将详细...

    oracle函数大全(分类成9个word文档)

    5. "oracle函数介绍(6) 著名函数之分析函数.doc"和"oracle函数介绍(7) 非著名函数之分析函数.doc"会进一步详细讨论这些高级函数,可能包括窗口函数的用法和实例。 6. "oracle函数介绍(8) 综述.doc"应该是对前面所有...

    oracle常用函数chm版

    6. **分析函数**:分析函数在处理大量数据时非常有用,如`RANK`、`DENSE_RANK`和`ROW_NUMBER`用于生成行序号,`LEAD`和`LAG`可以访问当前行的前一行或后一行数据,`FIRST_VALUE`和`LAST_VALUE`则用于获取分组内第一...

    oracle函数分类.rar

    **聚组函数**如`COUNT`、`SUM`、`AVG`、`MAX`和`MIN`用于对一组数据进行统计汇总。它们常在SQL查询的`GROUP BY`语句中使用,帮助我们快速获取每个分组的计数、总和、平均值、最大值和最小值。 **分析函数**如`RANK`...

    Oracle常见函数集锦

    Oracle数据库是世界上最广泛使用的数据库系统之一,其强大的功能和丰富的内置函数使得数据处理变得高效而灵活。本篇文章将深入探讨“Oracle常见函数集锦”,主要关注在SQL查询中常用的Oracle函数,这些函数对于数据...

    oracle函数大全(chm格式分类显示)

    Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,它提供了丰富的内置函数来支持各种数据处理和查询需求。本资源“oracle函数大全(chm格式分类显示)”详细介绍了Oracle中的主要函数类别,帮助用户更好地...

    ORACLE函数大全汇总详解(20100915补充修订版)

    本文档将详细介绍一系列Oracle函数及其应用场景,帮助用户更好地理解和掌握如何利用这些函数进行高效的数据处理。 #### 二、字符串函数 1. **ASCII**: 返回字符的ASCII码。 - 示例:`ASCII('A')` 返回65。 2. **...

    ORACLE函数大全

    7. **分组和分析函数**: - `GROUP BY`:根据一个或多个列对结果集进行分组。 - `ROLLUP`:创建分组的多级汇总。 - `CUBE`:生成所有可能的子集组合。 8. **连接查询相关函数**: - `JOIN`:将两个或更多表的...

    oracle函数大全

    在数据分析中,`COUNT()`、`SUM()`、`AVG()`、`MAX()`和`MIN()`等聚合函数用于对一组值进行统计汇总。它们在报表和数据分析中扮演着重要角色。 七、分组和排序函数 `GROUP BY`语句配合聚合函数用于对数据进行分组,...

    oracle书籍

    9. 分组和分析函数:如GROUP BY、ROLLUP、CUBE和RANK等,用于数据的分组汇总和复杂分析,是大数据处理和OLAP操作的关键。 10. 连接函数:如CONNECT_BY_ROOT和START_WITH,用于构建复杂的树状查询,处理层次结构数据...

    Oracle函数手册.zip

    6. **分组和分析函数**: - `GROUP BY`: 用于对数据进行分组。 - `ROLLUP()`: 生成多级汇总。 - `CUBE()`: 生成所有可能的子集组合。 - `RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`: 用于排序和生成行号。 7. **...

    Oracle常用函数使用方法及常用查询

    在Oracle数据库中,SQL函数被广泛应用于各种数据处理需求,例如数据筛选、计算汇总、格式化等。本文将详细介绍Oracle中的常见函数及其应用场景,帮助用户更好地理解和掌握这些实用工具。 #### 一、基本统计函数 1....

Global site tag (gtag.js) - Google Analytics