2022年分组聚合函数 .pdf

上传人:C****o 文档编号:40337562 上传时间:2022-09-09 格式:PDF 页数:22 大小:1.92MB
返回 下载 相关 举报
2022年分组聚合函数 .pdf_第1页
第1页 / 共22页
2022年分组聚合函数 .pdf_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《2022年分组聚合函数 .pdf》由会员分享,可在线阅读,更多相关《2022年分组聚合函数 .pdf(22页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、分组聚合函数总结(许琴琴)在实际SQL 应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析。比如我们常见的一些分组计算需求:求某个部门的薪资总和,薪资平均值,薪资最大值等等。分组聚合函数也可称之为多行函数,它的输入是多个行构成得一个行集(这个行集可以是一张表的所有行,也可以是按照某个维度进行分组后的某一组行),而输出都是一个值。1.分组聚合函数语法以及SQL语句执行过程SQL 中使用分组聚合函数的语法 SELECT column,group_function(column),.FROM table WHERE condition GROUP BY column

2、having ORDER BY column;在 select语句中使用 group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having 子句限制返回的结果集。查询语句的 select 和 group by,having,Order by 子句是分组聚合函数唯一出现的地方,在 where 子句中不能使用分组聚合函数。select department_id,sum(salary)from employees where salary10000groupby department_id havingsum(salary)11000orderbysu

3、m(salary)sql 语句执行过程(1)按select 找到where 满足条件的元组形成结果表。相当于:select department_id,salary from employees where salary10000 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 22 页 -(2)将结果表按group中指定的列进行分组,该属性列值相等的元组为一组,通常会在每组中作用集函数。(如果group指定多个列,先按第一列分组,然后在每个组中再按第二列分组)相当于:select department_id,sum(salary)from employees where sal

4、ary10000groupby department_id(3)如果group子句带having短语,则分组聚合后只有满足having指定条件的组才输出。相当于:select department_id,sum(salary)from employees where salary10000groupby department_id havingsum(salary)11000名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 22 页 -(4)如果有order子句,则将结果表按order子句指定的列升序或降序排序。相当于:select department_id,sum(salary

5、)from employees where salary10000groupby department_id havingsum(salary)11000orderbysum(salary)2.group by可选项 什么时候可以无:非分组查询中 非分组查询中,聚合函数实际上等于将表中所有记录作为一个组来运算。此时在select列表中指定的列只能是包含聚组函数,不能包含数据表本身的列。比如求所有员工的总工资。selectsum(salary)from employees 什么时候必须有:在分组查询中 分组查询中,聚合函数是将数据按分组关键字分组,然后对每一组的函数自变量中的内容进行聚合运算。S

6、elect 子句字段可以是分组关键字(group by 后面字段)和聚合函数。比如求各个部门员工总工资。注意:a.如果没有group by 子句,select 列表中不允许出现字段与分组函数混用的情况。b.在带有group by子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数。出现在 select 列表中的字段,如果不是包含在分组函数中,那么该字段必须同时出在Group by子句中。c.group by 后面字段的顺序不同分组结果不同。3.条件查询(where 和 having)在一个 sql 语句中可以有 where 子句和 havin

7、g 子句。having 与 where 子句类似,均用于设置限定条件。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 22 页 -where 子句的作用是在对查询结果进行分组前,将不符合 where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where 条件显示特定的行。having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用 having 条件显示特定的组,也可以使用多个分组标准进行分组。group by 可以与 where 来搭配使用,where 只能在group by 的前面,group by后面不能使用 where

8、;where 只针对单记录,不针对记录组的搜索条件,子句能包括分组函数,当用户要指定一个记录组的搜索条件只能使用having 表示。4.常用的聚合函数 4.1 计数(COUNT)COUNT()函数用来计算表中记录的个数(count(*)或者列中值的个数(count(column),计算内容由SELECT语句指定。使用COUNT函数时,必须指定一个列的名称或者使用星号,星号表示计算一个表中的所有记录。两种使用形式如下。*COUNT(*),计算表中行的总数,即使表中行的数据为 NULL,也被计入在内。*COUNT(column),计算column 列包含的行的数目,如果该列中某行数据为 NULL,

9、则该行不计入统计总数。注意:COUNT()函数只对那些传递到函数(括号)中的参数不是 NULL 的行计数。Select count(1)和Select count(*)返回的结果一样。(1)使用COUNT(*)函数对表中的行数计数。COUNT(*)函数将返回满足SELECT语句的WHERE子句中的搜索条件的函数。示例 查询employees 表中的所有记录的行数。实例代码:selectcount(*)from employees在该例中,SELECT语句中没有WHERE子句,那么认为表中的所有行都满足SELECT语句,所以SELECT语句将返回表中所有行的计数。如果DBMS在其系统表中存储了表

10、的行数,COUNT(*)将很快地返回表的行数,因为这时,DBMS不必从头到尾读取表,并对物理表中的行计数,而直接从系统表中提取行的计数。而如果DBMS没有在系统表存储表的行数,将具有NOT NULL 约束的列作为参数,使用COUNT函数,则可能更快地对表行计数。(2)使用COUNT(column)函数对一列中的数据计数。COUNT(column)函数可用于对一列中的数据值计数。与忽略了所有列的COUNT(*)函数不同,COUNT(column)函数逐一检查一列(或多列)中的值,并对那些值不是 NULL 的行计数。实例 查询多列中所有记录的行数 SELECTCOUNT(employee_id)F

11、ROM employees;(3)使用COUNT(column)函数同时对多列中的数据计数 COUNT(column)函数不仅可用于对一列中的数据值计数,也可以对多列中的数据值计数。如果对多列计数,则需要将要计数的多列连接后,作为 COUNT(column)函数的参数。实例 使用COUNT(column)函数对多列中的数据计数 SELECT COUNT(employee_id)AS c_eno,-employee_id不为空的记录个数COUNT(salary)AS c_salary,-salary不为空的记录个数COUNT(employee_id+salary)AS t_eno_salary-

12、两者都不为空的个数名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 22 页 -FROM employees;在进行两列的连接时,如果它们的数据类型不一致,要使用 CAST 表达式将它们转换成相同的数据类型。SELECT COUNT(employee_id)AS c_eno,-employee_id不为空的记录个数-department_id不为空的记录个数COUNT(department_id)AS c_dno,-两者都不为空的个数COUNT(employee_id+cast(department_id asint)as c_eno_dno FROM employees如果在被连

13、接的列中的任何一列有NULL 值时,那么连接的结果为NULL,则该列不会被COUNT()函数计数。4.2 求和(SUM)求和函数SUM()用于对数据求和,返回选取结果集中所有值的总和。语法如下 SELECT SUM(column_name)FROM table_name 说明:适用范围:SUM()函数只能作用于数值型数据,即列column_name 中的数据必须是数值型的。对NULL 值的处理:当对某列数据进行求和时,如果该列存在NULL 值,则SUM 函数会忽略该值。示例:查找员工总工资大于10000 的部门select department_id,sum(salary)from emplo

14、yees group by department_id havingsum(salary)10000orderby department_id;4.3 求平均值(AVG)函数AVG()用于计算一列中数据值的平均值。语法如下 SELECT AVG(column_name)FROM table_name 说明:适用范围:与SUM()函数一样,AVG()函数只能作用于数值型数据,即列column_name 中的数据必须是数值型的。对NULL 值的处理:在计算平均值时,AVG()函数将忽略NULL 值。AVG()函数的执行过程实际上是将一列中的值加起来,再将其和除以非NULL 值的数目,等价于 sum

15、(column)/count(column)。如果在某列中,所有行的值都是NULL,则AVG()函数将返回NULL 值。示例:selectavg(salary)as AVG1,sum(salary)/count(*)as AVG2,sum(salary)/count(salary)as AVG3,FROM employees运行结果如图所示 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 22 页 -可以发现得实际上avg(salar目(也就等返回的是表4.4 求最大当需要时,可以使SELEC说明:适用范MAX()/MIN对 NU如果在该列示例:SELEjob_id;注意:在字符

16、的顺序排列同,则比较在日期其大小排列4.5 聚合函前面介置),也可于 MAX()/可以使所选列中的SELEC说明:值,处理所例如查selec5 ROLLUP得到了不同上,“avgry)语句的执等价于coun表中所有记大值(MAX),要了解一列使用MIN()函CT MAX(c:范围:列coN()函数将返ULL值的处理列中,所有:获得各种ECT job_i:符串数据类列,越往后较下一个字期数据类型列就是日期函数的重值介绍的几种可以只对列MIN()函数使用 ALL关的非重值数T COUNT(ALL/DIS所有数据。查询工资部ctcount(dP运算符和同的结果。(salary)”执行过程实t(sal

17、ary)记录的个数,最小值(M列中的最大值函数。语法column_namolumn_name返回与被传理:确定列有行的值都是种工作的最高id,max(类型中使用后,其值越大字符,以此类型中使用 MA期时间的早晚值处理 聚合函数,列中的非重值来讲,重值键字指明对数据进行处理ALL/DISTITINCT 在缺其他聚合函门编号列中distinct d和cube运算与“sum(s实际上是将s)。而语句,而不管saMIN)值时,可以法如下。me)/MIN e中的数据可传递的列同一列中的最大值是 NULL,则高工资和最(salary),MAX 和 MIN大。当然,类推,返回AX和 MIN时晚,越早认可以作

18、用值进行处理值处理意义对所选列中理。以 COUNCT colu缺省状态下函数的用法中存在的不department算符 salary)/csalary 列中“sum(salaalary 列中的以使用MAX()(column_n可以是数值一数据类型值(最小值则 MAX、MIN最低工资,min(saN时,对字符对于汉字则回结果的数据时,对日期认为其值越小于所选列中理,即把重复义不大。的所有数据UNT()函数为umn_name)下,默认是 A法与此相同不同记录的数t_id)FROMcount(sala中的值加起来ary)/coun的数值是否)函数;同样name)FROM值、字符串或型的单一值)时,MA

19、X、N函数将返alary)FR符型数据的则是按照其据类型为字时间类型的小,返回结中的所有数复的值只取据进行处理为例,语法FROM tablALL关键字。数目:M employeeary)”语句来,再将其nt(*)”则不否为NULL。样,当需要M table_n或是日期时。MIN函数忽返回 NULL值ROM empl的最大值,是其全拼拼音排字符型数据。的数据也可结果的数据类数据(不管列取一次进行聚理,使用 DIS法如下。e_name 字,即不管是es;句是等价的其和除以非N不然,因为要了解一列中name 时间数据类忽略 NULL值值。loyees g是按照首字排列的,若。以求其最大类型为日期列中

20、的数据聚合分析。STINCT关键是否有重。因为NULL 值的数为 COUNT(*)中的最小值型。值。但是,roupby字母由 AZ若首字符相大/最小值,期型。据是否有重当然,对键字指明对数值Z对名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 22 页 -5.1 ROLLUP 运算符 在Group By 中使用Rollup 可以产生常规分组汇总行以及分组小计。如果是ROLLUP(A,B,C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,然后对全表进行GROUP BY操作,最后进行union操作。Rollup

21、 后面跟了n个字段,就将进行n+1次分组,从左到右每次减少一个字段进行分组;然后进行union。Rollup 一个字段:select department_id,sum(salary)from employees groupbyrollup(department_id);首先会对 department_id进行GROUP BY,结果等价于:select department_id,sum(salary)from employees groupbydepartment_id orderby department_id;然后对全表进行GROUP BY操作,结果等价于:selectsum(salar

22、y)from employees 最后进行union操作。意义:首先根据部门编号分组计算工资,然后对分组进行汇总合计,并且一次呈现结果,这是常规分组函数无法做到的。注意:由于第二步中没有department_id字段,和第一步产生的表union时,department_id字段为空,以此类推。Rollup 多个字段 select department_id,job_id,sum(salary)from employees groupbyrollup(department_id,job_id);首先会对(department_id,job_id)进行GROUP BY,相当于 select dep

23、artment_id,job_id,sum(salary)from employees 名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 22 页 -groupby department_id,job_id orderby department_id,job_id;然后对(department_id)进行GROUP BY,相当于 select department_id,sum(salary)from employees groupby department_id orderby department_id;然后对全表进行GROUP BY操作,相当于 selectsum(salar

24、y)from employees 最后union。1234abc意义:a是对各个部门按照job分组进行薪资汇总;b是对各个部门总体进行薪资汇总;c是对所有部门进行薪资汇总。5.2 cube运算符 在Group By 中使用Cube 可以产生Rollup结果集+和多维度的交叉表数据源。GROUP BY CUBE(A,B,C),首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。Cube 后面跟了n个字段,就将进行2的N 次方的分组运算,然后进行union;名师资料总结-精品资料欢迎下载-名师精心整理

25、-第 8 页,共 22 页 -SELECT department_id,job_id,SUM(salary)FROM employees GROUPBY cube(department_id,job_id);首先会对(department_id,job_id)进行GROUP BY,相当于 select department_id,job_id,sum(salary)from employees groupby department_id,job_id orderby department_id,job_id;-24 rows然后对(department_id)进行GROUP BY,相当于 se

26、lect department_id,sum(salary)from employees groupby department_id orderby department_id;-12 rows然后对(job_id)进行GROUP BY,相当于 select job_id,sum(salary)from employees groupby job_id orderby job_id;-20 rows 然后对全表进行GROUP BY操作,相当于 selectsum(salary)from employees;-1 rows 最后union。-57 rows5.3 GROUPING函数 Rollu

27、p 和Cube 有点抽象,他分别相当于n+1 和2的n次方常规Group by 运算;那么在Rollup 和Cube 的结果集中如何很明确的看出哪些行是针对那些列或者列的组合进行分组运算的结果的?答案是可以使用Grouping 函数;没有被Grouping到返回1,否则返回0。举例如下:SELECT department_id,job_id,SUM(salary),GROUPING(department_id)GRP_DEPT,GROUPING(job_id)GRP_JOB FROM employees GROUPBY ROLLUP(department_id,job_id);名师资料总结-精

28、品资料欢迎下载-名师精心整理-第 9 页,共 22 页 -5.4 Grouping Set 可以使用 Grouping Set 来代替多次 UNION:Grouping Set单一字段 SELECT department_id,job_id,sum(salary)FROM employees GROUPBY GROUPING SETS(department_id,job_id);相当于先按 department_id 分组,等价于SELECT department_id,sum(salary)FROM employees GROUP BYdepartment_id 然后按 job_id 分组,

29、等价于SELECT job_id,sum(salary)FROM employees GROUP BY job_id最后结果 union all 到一起。名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 22 页 -Grouping Set组合字段 SELECT department_id,job_id,manager_id,sum(salary)FROM employees GROUPBY GROUPINGSETS(department_id,job_id),(job_id,manager_id);相当于先按 department_id,job_id分组SELECT depar

30、tment_id,job_id,sum(salary)FROM employees GROUPBY department_id,job_id 然后按 job_id,manager_id分组SELECT job_id,manager_id,sum(salary)FROM employees GROUPBY job_id,manager_id;最后union all。名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 22 页 -123名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 22 页 -6.自定义聚集函数 6.1 原理介绍 Oracle 提供了很多预定义好的聚集

31、函数,比如前面讲的Max(),Sum(),AVG(),但是这些预定义的聚集函数基本上都是适应于标量数据,对于复杂的数据类型,比如说用户自定义的 Object type,Clob等,是不支持的。但是,幸运的是,Oracle 的定制功能十分强大,允许用户定制自己的聚集函数。用户可以通过实现 Oracle 的 Extensibility Framework中的 ODCIAggregate interface来创建自定义聚集函数,而且自定义的聚集函数跟内建的聚集函数用法上没有差别。通过实现 ODCIAggregate rountines来创建自定义的聚集函数。可以通过定义一个对象类型(Object T

32、ype),然后在这个类型内部实现ODCIAggregate接口函数(routines),可以用任何一种 Oracle 支持的语言来实现这些接口函数,比如 C/C+,JAVA,PL/SQL 等。在这个 Object Type定义之后,相应的接口函数也都在该Object Type Body内部实现之后,就可以通过 CREATE FUNCTION语句来创建自定义的聚集函数了。每个自定义的聚集函数需要实现4 个 ODCIAggregate接口函数,这些函数定义了任何一个聚集函数内部需要实现的操作,这些函数分别是 initialization,iteration,merging和termination。

33、a.STATIC FUNCTION ODCIAGGREGATEINITIALIZE(s_obj IN OUT str_agg_type)RETURN NUMBER 自定义聚集函数初始化操作,从这儿开始一个聚集函数。初始化的聚集环境会以对象实例传回给 oracle.b.MEMBER FUNCTION ODCIAGGREGATEITERATE(self IN OUT str_agg_type,p_var IN VARCHAR2)RETURN NUMBER 自定义聚集函数最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作.self为当前聚集

34、函数的指针,用来与前面的计算结果进行关联 这个函数用来遍历需要处理的数据,被oracle 重复调用。每次调用的时候,当前的聚集环境和新的(一组)值会作为传入参数。这个函数会处理这些传入值,然后返回更新后的聚集环境.这个函数对每一个NON-NULL 的值都会被执行一次。NULL值不会被传递个聚集函数。c.MEMBER FUNCTION ODCIAGGREGATEMERGE(self IN OUT str_agg_type,p_obj IN str_agg_type)RETURN NUMBER 用来合并两个聚集函数的两个不同的指针对应的结果,用户合并不同结果结的数据,特别是处理并行查询聚集函数的时

35、候.这个函数用来把两个聚集环境整合在一起,一般用来并行计算中(当一个函数被设置成enable parallel处理的时候)。d.FUNCTION ODCIAGGREGATETERMINATE(self IN str_agg_type,x_var OUT VARCHAR2,p_flags IN NUMBER)RETURN NUMBER 终止聚集函数的处理,返回聚集函数处理的结果.名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 22 页 -这个函数是 Oracle 调用的最后一个函数。它接收聚集环境作为参数,返回最后的聚集函数处理的结果.6.2 应用之字符串相SUM(字符串相连接)

36、第一步:建立对象类型规范createorreplacetype str_agg_type asobject(str VARCHAR2(300),separator_flag VARCHAR2(64),-分隔符,默认用自由定义|,可以修改此处STATIC FUNCTION ODCIAGGREGATEINITIALIZE(s_obj IN OUT str_agg_type)RETURN NUMBER,MEMBERFUNCTION ODCIAGGREGATEITERATE(selfINOUT str_agg_type,p_var INVARCHAR2)RETURN NUMBER,MEMBERFUNC

37、TION ODCIAGGREGATEMERGE(selfINOUT str_agg_type,p_obj IN str_agg_type)RETURN NUMBER,MEMBERFUNCTION ODCIAGGREGATETERMINATE(selfIN str_agg_type,x_var OUT VARCHAR2,p_flags INNUMBER)RETURN NUMBER);第二步:建立对象类型体createorreplacetypebody str_agg_type is-自定义聚集函数初始化操作STATIC FUNCTION ODCIAGGREGATEINITIALIZE(s_obj

38、 IN OUT str_agg_type)RETURN NUMBER isbegin s_obj:=str_agg_type(,);-初始化为空,用逗号分隔RETURN ODCICONST.SUCCESS;end;-定义函数的功能,实现字符串sum(拼接)MEMBERFUNCTION ODCIAGGREGATEITERATE(selfINOUT str_agg_type,p_var INVARCHAR2)RETURN NUMBER isbegin self.str:=self.str|p_var|self.separator_flag;RETURN ODCICONST.SUCCESS;end;

39、-用来合并两个聚集函数的两个不同的指针对应的结果,此处默认即可MEMBERFUNCTION ODCIAGGREGATEMERGE(selfINOUT str_agg_type,p_obj IN str_agg_type)RETURN NUMBERisbeginRETURN ODCICONST.SUCCESS;end;名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 22 页 -定义终止聚集函数的处理,返回聚集函数处理的结果MEMBERFUNCTION ODCIAGGREGATETERMINATE(selfIN str_agg_type,x_var OUT VARCHAR2,p_f

40、lags INNUMBER)RETURN NUMBERisbeginIF x_var ISNOT NULL THEN x_var:=SUBSTR(self.str,1,LENGTH(self.str)-1);ELSE x_var:=self.str;END IF;RETURN ODCICONST.SUCCESS;end;end;第三步:创建自定义聚集函数createorreplacefunction sum_str(p_str invarchar2)returnvarchar2AGGREGATEUSING str_agg_type;第四步:使用自定义聚集函数找出部门号为 60,70,80的部门

41、员工名称集合SQL SELECT department_id,sum_str(last_name)as ename FROM employees where department_id in(60,70,80)GROUP BY department_id;输出:DEPARTMENT_ID ENAME-60 Hunold,Ernst,Austin,Lorentz,Pataballa,70 Baer,80 Russell,Doran,Smith,McEwen,Sully,King,Tuvault,Cambrault,Olsen,Hall,Livingston,Ta 注意:如果希望自定义的聚集函数和

42、系统预定义的聚集函数同名,比如createorreplacefunctionsum(p_str invarchar2)returnvarchar2AGGREGATEUSING str_agg_type;那么在使用该自定义聚集函数是必须指定函数所属用户,否则报错。SQL SELECT department_id,sum(last_name)as ename FROM employees where department_id in(60,70,80)GROUP BY department_id;ORA-01722:invalid number SQL SELECT department_id,x

43、qq.sum(last_name)as ename FROM employees where department_id in(60,70,80)GROUP BY department_id;DEPARTMENT_ID ENAME-60 Hunold,Ernst,Austin,Lorentz,Pataballa,70 Baer,80 Russell,Doran,Smith,McEwen,Sully,King,Tuvault,Cambrault,Olsen,Hall,Livingston,Ta 名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 22 页 -6.2 应用之模拟预定义

44、COUNT 创建自定义对象类型规范创建自定义对象类型体创建自定义聚集函数使用自定义聚集函数第一步:创建自定义对象类型规范createorreplacetype count_num_type asobject(num number,staticfunction ODCIAggregateInitialize(p_type InOut count_num_type)returnnumber,memberfunction ODCIAggregateIterate(selfInOut count_num_type,p_num Innumber)returnnumber,memberfunction O

45、DCIAggregateMerge(selfInOut count_num_type,p_type In count_num_type)returnnumber,memberfunction ODCIAggregateTerminate(selfInOut count_num_type,x_num Outnumber,flags Innumber)returnnumber);第二步:创建自定义对象类型体createorreplacetypebody count_num_type isstaticfunction ODCIAggregateInitialize(p_type InOut coun

46、t_num_type)returnnumberisbegin p_type:=count_num_type(0);return ODCIConst.Success;end;memberfunction ODCIAggregateIterate(selfInOut count_num_type,p_num Innumber)returnnumberisbegin self.num:=self.num+1;return ODCIConst.Success;end;memberfunction ODCIAggregateMerge(selfInOut count_num_type,p_type In

47、 count_num_type)returnnumberisbegin self.num:=self.num;return ODCIconst.Success;end;memberfunction ODCIAggregateTerminate(selfInOut count_num_type,x_num Outnumber,名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 22 页 -flags Innumber)returnnumberisbegin x_num:=self.num;return ODCIConst.Success;end;end;第三步:创建自定义聚集函数CR

48、EATE OR REPLACE FUNCTION count_num(input number)RETURN numberPARALLEL_ENABLEAGGREGATE USING count_num_type;第四步:使用自定义聚集函数select department_id,count_num(employee_id),count(employee_id)from employees groupby department_id6.3 应用之模拟预定义 SUM 创建自定义对象类型规范创建自定义对象类型体创建自定义聚集函数使用自定义聚集函数第一步:创建自定义对象类型规范createorrep

49、lacetype sum_num_type asobject(num number,staticfunction ODCIAggregateInitialize(p_type InOut sum_num_type)returnnumber,memberfunction ODCIAggregateIterate(selfInOut sum_num_type,p_num Innumber)returnnumber,memberfunction ODCIAggregateMerge(selfInOut sum_num_type,p_type In sum_num_type)returnnumber,

50、memberfunction ODCIAggregateTerminate(selfInOut sum_num_type,x_num Outnumber,flags Innumber)returnnumber);名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 22 页 -第二步:创建自定义对象类型体createorreplacetypebody sum_num_type isstaticfunction ODCIAggregateInitialize(p_type InOut sum_num_type)returnnumberisbegin p_type:=sum_num_ty

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com