Oracle ROLLUP和CUBE 用法

合集下载

oracle中group by用法

oracle中group by用法

oracle中group by用法摘要:1.Oracle 中Group By 概述2.Group By 的基本语法3.Group By 的常见用法1.按某一列分组2.按多列分组3.使用聚合函数4.使用rollup 和cube5.使用having 子句4.Group By 的高级用法1.去除重复记录2.分组排序3.结合其他SQL 语句5.Group By 在实际应用中的案例正文:在Oracle 数据库中,Group By 是一个非常重要的SQL 语句组成部分,它可以帮助我们对查询结果进行分组和汇总。

本文将详细介绍Oracle 中Group By 的用法,包括基本语法、常见用法、高级用法以及在实际应用中的案例。

1.Oracle 中Group By 概述Group By 是SQL 语句中用于对查询结果进行分组和汇总的关键字。

通过使用Group By,我们可以将查询结果按照某一列或多个列进行分组,并对每组数据进行汇总。

2.Group By 的基本语法在Oracle 中,Group By 的基本语法如下:```sqlSELECT column1, column2, aggregate_function(column)FROM table_nameWHERE conditionGROUP BY column1, column2ORDER BY column1, column2;```其中,`aggregate_function` 可以是`COUNT`、`SUM`、`AVG`、`MAX`、`MIN` 等聚合函数,`column1` 和`column2` 是需要分组的列,`condition` 是查询条件,`ORDER BY` 子句用于对分组后的结果进行排序。

3.Group By 的常见用法接下来,我们将介绍Group By 的常见用法:3.1 按某一列分组```sqlSELECT department, COUNT(employee_id)FROM employeesGROUP BY department;```上述语句将按照`department` 列对`employees` 表进行分组,并计算每个部门的员工数量。

Oracle物化视图说明

Oracle物化视图说明

Oracle物化视图说明⼀.物化视图概述Oracle的物化视图是包括⼀个查询结果的对像,它是远程数据的的本地副本,或者⽤来⽣成基于数据表求和的汇总表。

物化视图存储基于远程表的数据,也可以称为快照。

物化视图可以⽤于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执⾏查询时,就可以避免进⾏这些耗时的操作,⽽从快速的得到结果。

物化视图有很多⽅⾯和索引很相似:使⽤物化视图的⽬的是为了提⾼查询性能;物化视图对应⽤透明,增加和删除物化视图不会影响应⽤程序中SQL语句的正确性和有效性;物化视图需要占⽤存储空间;当基表发⽣变化时,物化视图也应当刷新。

物化视图可以查询表,视图和其它的物化视图。

通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。

对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。

如果你想修改本地副本,必须⽤⾼级复制的功能。

当你想从⼀个表或视图中抽取数据时,你可以⽤从物化视图中抽取。

对于数据仓库,创建的物化视图通常情况下是聚合视图,单⼀表聚合视图和连接视图。

在复制环境下,创建的物化视图通常情况下主键,rowid,和⼦查询视图。

物化视图由于是物理真实存在的,故可以创建索引。

1.1 物化视图可以分为以下三种类型(1)包含聚集的物化视图;(2)只包含连接的物化视图;(3)嵌套物化视图。

三种物化视图的快速刷新的限制条件有很⼤区别,⽽对于其他⽅⾯则区别不⼤。

创建物化视图时可以指定多种选项,下⾯对⼏种主要的选择进⾏简单说明:(1)创建⽅式(BuildMethods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。

BUILD IMMEDIATE是在创建物化视图的时候就⽣成数据。

BUILD DEFERRED则在创建时不⽣成数据,以后根据需要在⽣成数据。

默认为BUILD IMMEDIATE。

(2)查询重写(QueryRewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。

Oracle分析函数的使用(主要是rollup用法)

Oracle分析函数的使用(主要是rollup用法)

Oracle分析函数的使⽤(主要是rollup⽤法)分析函数是oracle 8.1.6中就引⼊的⼀个全新的概念,为我们分析数据提供了⼀种简单⾼效的处理⽅式.在分析函数出现以前,我们必须使⽤⾃联查询,⼦查询或者内联视图,甚⾄复杂的存储过程实现的语句,现在只要⼀条简单的sql语句就可以实现了,⽽且在执⾏效率⽅⾯也有相当⼤的提⾼.分析函数的使⽤⽅法1. ⾃动汇总函数rollup,cube,2. rank 函数, rank,dense_rank,row_number3. lag,lead函数4. sum,avg,的移动增加,移动平均数5. ratio_to_report报表处理函数6. first,last取基数的分析函数本⼈在项⽬中由于⽤到⼩计、合计的统计,前⾯想到⽤union all,但这样有点⿇烦并且效率也不⾼,就从⽹上查到资料说是oracle 8i、oracl 9i、oracle 10g 中已经分析函数对数据统计的处理,于是就顺便学习了⼀下这些函数的⽤法,拿出来分享给⼤家共同学习。

1、Oracle ROLLUP和CUBE ⽤法Oracle的GROUP BY语句除了最基本的语法外,还⽀持ROLLUP和CUBE语句。

如果是Group by ROLLUP(A, B, C)的话,⾸先会对(A、B、C)进⾏GROUP BY,然后对(A、B)进⾏GROUP BY,然后是(A)进⾏GROUP BY,最后对全表进⾏GROUP BY操作。

如果是GROUP BY CUBE(A, B, C),则⾸先会对(A、B、C)进⾏GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进⾏GROUP BY操作。

grouping_id()可以美化效果。

除了使⽤GROUPING函数,还可以使⽤GROUPING_ID来标识GROUP BY的结果。

也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 这样任意按⾃⼰想要的形式结合统计数据,⾮常⽅便。

精通 oracle 10g plsql 编程-学习笔记

精通 oracle 10g plsql 编程-学习笔记

1.PL/SQL综述本章学习目标,了解如下内容:PL/SQL的功能和作用PL/SQL 的优点和特征;Oracle 10g、Oracle9i 的PL/SQL新特征1.1.SQL简介1.1.1.SQL语言特点SQL语言采用集合操作方式1.1.2.SQL语言分类●数据查询语言(SELECT语句):检索数据库数据。

●数据操纵语言(DML):用于改变数据库数据。

包括insert,update和delete三条语句。

●事务控制语言(TCL):用于维护数据库的一致性,包括commit,rollback和savepoint 三条语句●数据定义语言(DDL):用户建立、修改和删除数据库对象。

●数据控制语言(DDL):用于执行权限授予和收回操作。

包括grant 和revoke两条命令。

1.1.3.SQL 语句编写规则●SQL关键字不区分大小写●对象名和列名不区分大小写●字符值和日期值区分大小写●书写格式随意1.2.PL/SQL简介1.3.Oracle 10G PL/SQL 新特征2.PL/SQL开发工具本章学习目标:学会使用SQL*PLUS学会使用PL/SQL developer;学会使用Procedure Builder。

2.1.SQL*PLUS在命令行运行SQL*PlusSqlplus [username]/[password] [@server]3.PL/SQL 基础学习目标:●了解PL/SQL块的基本结构以及PL/SQL块的分类;●学会在PL/SQL块中定义和使用变量●学会在PL/SQL块中编写可执行语句;●了解编写PL/SQL代码的指导方针;●了解Oracle 10g的新特征——新数据类型BINARY_FLOAT 和BINARY_DOUBLE,以及指定字符串文本的新方法。

3.1.PL/SQL 块简介3.1.1.PL/SQL块结构3.1.2.PL/SQL 块分类匿名块命名块子程序触发器3.2. 定义并使用变量3.2.1.标量变量3.2.2.复合变量3.2.3.参照变量3.2.4.LOB 变量3.2.5.非PL/SQL 变量3.3.编写 PL/SQL 代码3.3.1.PL/SQL 词汇单元分隔符标识符文本(数字文本,字符文本,字符串文本,布尔文本,日期时间文本)注释3.3.2.PL/SQL 代码编码规则标识符命名规则大小写规则代码缩进嵌套块和变量范围PL/SQL中可以使用的SQL函数4.使用SQL语句学习目标:学会使用SELECT语句去完成基本查询功能学会使用INSERT,UPDA TE和DELETE语句去操作数据库数据学会使用COMMIT,ROLLBACK和SA VEPOINT语句去控制事务学会使用SELECT语句去实现各种复杂查询功能(数据分组、连接查询、子查询、层次查询、合并查询等)4.1.使用基本查询处理NULL:函数nvl(expr1,expr2),nvl2(expr1,expr2,expr3)4.2.使用DML语句使用多表插入数据语法:INSERT ALL insert_into_clause [value_clause] subquery;INSERT conditional_insert_clause subquery;示例1:使用ALL 操作符执行多表插入INSERT ALLWHEN deptno=10 THEN INTO dept10WHEN deptno=20 THEN INTO dept20WHEN deptno=30 THEN INTO dept30WHEN job=’CLERK’ THEN INTO clerkELSE INTO otherSelect * from emp;示例2:使用FIRST 操作符执行多表插入INSERT FIRSTWHEN deptno=10 THEN INTO dept10WHEN deptno=20 THEN INTO dept20WHEN deptno=30 THEN INTO dept30WHEN job=’CLERK’ THEN INTO clerkELSE INTO otherSELECT * FROM emp;4.3.使用事务控制语句4.3.1.事务和锁4.3.2.提交事务4.3.3.回退事务设置保存点:savepoint a;或者exec dbms_transaction.savepoint(‘a’)取消部分事务Rollback to a;或者Exec dbms_transaction.rollback_savepoint(‘a’)取消全部事务:Rollback; 或者exec dbms_transaction.rollback() 4.3.4.只读事务4.3.5.顺序事务4.4.数据分组4.4.1.分组函数MaxMinAvgSumCountVarianceStddev使用分组函数注意事项:●当使用分组函数时,除了函数Count(*) 之外,其他分组函数都会忽略NULL行。

Oracle分组函数之ROLLUP的基本用法

Oracle分组函数之ROLLUP的基本用法

Oracle分组函数之ROLLUP的基本⽤法rollup函数本博客简单介绍⼀下oracle分组函数之rollup的⽤法,rollup函数常⽤于分组统计,也是属于oracle分析函数的⼀种环境准备create table dept as select * from scott.dept;create table emp as select * from scott.emp;业务场景:求各部门的⼯资总和及其所有部门的⼯资总和这⾥可以⽤union来做,先按部门统计⼯资之和,然后在统计全部部门的⼯资之和select a.dname, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptnogroup by a.dnameunion allselect null, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptno;上⾯是⽤union来做,然后⽤rollup来做,语法更简单,⽽且性能更好select a.dname, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptnogroup by rollup(a.dname);业务场景:基于上⾯的统计,再加需求,现在要看看每个部门岗位对应的⼯资之和select a.dname, b.job, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptnogroup by a.dname, b.jobunion all//各部门的⼯资之和select a.dname, null, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptnogroup by a.dnameunion all//所有部门⼯资之和select null, null, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptno;⽤rollup实现,语法更简单select a.dname, b.job, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptnogroup by rollup(a.dname, b.job);假如再加个时间统计的,可以⽤下⾯sql:select to_char(b.hiredate, 'yyyy') hiredate, a.dname, b.job, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptnogroup by rollup(to_char(b.hiredate, 'yyyy'), a.dname, b.job);cube函数select a.dname, b.job, sum(b.sal)from scott.dept a, scott.emp bwhere a.deptno = b.deptnogroup by cube(a.dname, b.job);cube函数是维度更细的统计,语法和rollup类似假设有n个维度,那么rollup会有n个聚合,cube会有2n个聚合rollup统计列rollup(a,b) 统计列包含:(a,b)、(a)、()rollup(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a)、()....cube统计列cube(a,b) 统计列包含:(a,b)、(a)、(b)、()cube(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()....总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。

Oracle分组ROLLUP、GROUP BY、GROUPING、GROUPING SETS区别和作用+++

Oracle分组ROLLUP、GROUP BY、GROUPING、GROUPING SETS区别和作用+++

Oracle分组ROLLUP、GROUP BY、GROUPING、GROUPING SETS区别和作用1.ROLLUPROLLUP的作用相当于SQL> set autotrace onSQL> select department_id,job_id,count(*)2 from employees3 group by department_id,job_id4 union5 select department_id,null,count(*)6 from employees7 group by department_id8 union9 select null,null,count(*)10 from employees;最后面的SA_REP表示此jobid没有部门,为null这里的union系统默认进行了排序使用ROLLUP能达到上面GROUP BY的功能,但性能开销更小SQL> ed已写入file afiedt.buf1 select department_id,job_id,count(*)2 from employees3* group by rollup (department_id,job_id)SQL> /2.为什么ROLLUP会比GROUP BY性能好ROLLUP(a,b,c)=a,b,c+a,b+a+All通过一次全表扫描,得出a,b,c的分组统计信息后;分组统计a,b 相同,c不同的项即可得到a,b;依此类推……,就不用去多次全表扫描3.ROLLUP的另类用法ROLLUP(a,(b,c))ROLLUP((a,b))SQL> ed已写入file afiedt.buf1 select department_id,job_id,count(*)2 from employees3* group by rollup ((department_id,job_id))SQL> /注意面的语句是group by rollup ((department_id,job_id))不是group by rollup (department_id,job_id)4.GROUPING函数的作用是放总记如一个公司有多个部门,一个部门有多个岗位,一个岗位上有多个人Rollup(部门,工作岗位) sum(每人的工资)当部门的GROUPING为0,工作岗位的GROUPING也为0时,说明是公司发的总工资,此时放公司总计当部门的GROUPING为0,工作岗位的GROUPING也为1时,说明是部门发的总工资,此时放部门小记当部门的GROUPING为1,工作岗位的GROUPING也为1时,显示的是某部门某职位的工资和计SQL> SELECT department_id DEPTID, job_id JOB,2 SUM(salary),3 GROUPING(department_id) GRP_DEPT,4 GROUPING(job_id) GRP_JOB5 FROM employees6 GROUP BY ROLLUP(department_id, job_id);第一个SA_REP表示此jobid没有部门,为null5.GROUPING SETS与GROUPING的作用是不同的Oracle服务器计算GROUPING SETS子句中所有的组并将结果通过UNION ALL组合成一个结果集. GROUPING SETS的效果:1.只需要访问一次基表.2.不需要写很复杂的UNION语句.SELECT department_id, job_id, null manager_id,avg(salary)FROM employeesGROUP BY (department_id,job_id)UNION ALLSELECT null department_id, job_id, manager_id,avg(salary)FROM employeesGROUP BY (job_id,manager_id)等同于SQL> set autotrace onSQL> SELECT department_id, job_id,2 manager_id,avg(salary)3 FROM employees4 GROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id));上面得到的是通过job_id,manager_id分组的avg(salary)下面的是通过department_id,job_id分组的avg(salary)。

oracle rollup用法

oracle rollup用法

oracle rollup用法Oracle Rollup是一种递归的GROUP BY操作,可用于在数据集中按多个维度生成汇总数据。

Rollup可用于生成多级分组的分组集合,并计算每个分组级别的聚合值。

在本文中,我们将介绍Oracle Rollup的用法和相关参考内容。

1. Rollup的语法和用法:Rollup语句的基本语法如下:```SELECT col1, col2, ..., coln, aggregate_func(col)FROM table_nameGROUP BY ROLLUP(col1, col2, ..., coln);```其中,col1到coln是要进行分组的列名,aggregate_func是要应用于聚合的函数,table_name是要从中获取数据的表名。

Rollup语句的执行过程如下:- 根据指定的分组列进行分组。

- 计算每个分组集合中的聚合值。

- 按照指定的分组列的层次结构,生成多级分组的分组集合,并为每个分组级别计算聚合值。

例如,如果我们有一个表orders,包含订单日期、产品类别和销售额三列,我们可以使用Rollup来计算每个日期、每个产品类别和总销售额的聚合值:```SELECT order_date, product_category, SUM(sales_amount) FROM ordersGROUP BY ROLLUP(order_date, product_category);```该语句将生成一个包含所有日期、所有产品类别和总销售额的分组集合,并计算每个分组级别的聚合值。

2. Rollup的参考内容:以下是一些可以作为参考的Oracle Rollup相关内容:- Oracle官方文档: Oracle官方文档提供了详细的Rollup用法说明和示例。

可以在Oracle官方网站的文档库中搜索相关文档。

- Oracle Rollup教程: 有许多网上提供的免费Rollup教程,可以帮助你更深入地了解Rollup的概念、语法和用法。

oracle Rollup 和 Cube用法

oracle Rollup 和 Cube用法

oracle Rollup 和Cube用法Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。

如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。

如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。

grouping_id()可以美化效果:Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。

除本文内容外,你还可参考:分析函数参考手册:/post/419/33028分析函数使用例子介绍:/post/419/44634SQL> create table t as select * from dba_indexes;表已创建。

SQL> select index_type, status, count(*) from t group by index_type, status;INDEX_TYPE STATUS COUNT(*)--------------------------- -------- ----------LOB V ALID 51NORMAL N/A 25NORMAL V ALID 479CLUSTER V ALID 11下面来看看ROLLUP和CUBE语句的执行结果。

SQL> select index_type, status, count(*) from t group by rollup(index_type, status);INDEX_TYPE STATUS COUNT(*)--------------------------- -------- ----------LOB V ALID 51LOB 51NORMAL N/A 25NORMAL V ALID 479NORMAL 504CLUSTER V ALID 11CLUSTER 11566已选择8行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle ROLLUP和CUBE 用法rollup只有第一个参数起作用也是理解不正确的,先看看例子吧:SQL> select grade,id,num from a;GRADE ID NUM---------- ---------- ----------a 1 1a 2 2b 3 4b 4 4对grade字段进行rollup:SQL> select grade,sum(num) from a group by rollup(grade);GRADE SUM(NUM)---------- ----------a 3b 811同时对grade和id字段进行rollupSQL> SELECT decode(grouping_id(grade,ID),2,'小计',3,'合计',grade) grade,2 decode(grouping_id(grade,ID),1,'小计',3,'合计',ID) ID,3 SUM(num)4 FROM a GROUP BY ROLLUP(grade,ID)5 /GRADE ID SUM(NUM)---------- ---------- ----------a 1 1a 2 2a 小计 3b 3 4b 4 4b 小计 8合计合计 11再看看先对grade分组,再对id进行rollup的情况:SQL> SELECT grade,2 decode(GROUPING(ID),1,'合计',ID) ID,3 SUM(num)4 FROM a GROUP BY grade,rollup(ID)5 /GRADE ID SUM(NUM)---------- ---------- ----------a 1 1a 2 2a 合计 3b 3 4b 4 4b 合计 86 rows selected这里GROUP BY grade,rollup(ID)跟你的理解应该很相近了,而且可以看出GROUP BY grade,rollup(ID)结果跟ROLLUP(grade,ID)很类似,只是少了最后1行总合计,但是也可以就看出rollup多个字段时并不是只有1个字段起作用的可以认为你理解的是只对第一个字段的累计,跟GROUP BY grade,rollup(ID)的结果很接近,再看rollup3个字段的情况:SQL> select part,grade,id,num from a;PART GRADE ID NUM---- ---------- ---------- ----------p1 a 1 1p1 a 2 2p1 b 3 3p1 b 4 4p2 c 5 5p2 d 6 6SQL>SQL> SELECT decode(grouping_id(part,grade,ID),7,'总计',part) part,2 decode(grouping_id(part,grade,ID),3,'小计',7,'总计',grade) grade,3 decode(grouping_id(part,grade,ID),1,'小计',3,'小计',7,'总计',ID) ID,4 SUM(num)5 FROM a GROUP BY ROLLUP(part,grade,ID)6 /PART GRADE ID SUM(NUM)---- ---------- ---------- ----------p1 a 1 1p1 a 2 2p1 a 小计 3p1 b 3 3p1 b 4 4p1 b 小计 7p1 小计小计 10p2 c 5 5p2 c 小计 5p2 d 6 6p2 d 小计 6p2 小计小计 11总计总计总计 2113 rows selected这里不光只对第一个字段做了累计,先按(part,grade,ID)分组累计,然后按(part,grade)分组累计,再按(part)分组累计,最后累计全部再看看rollup 和 cube的区别:对于ROLLUP(part,grade,ID),grouping_id(part,grade,ID)的值范围在(0,1,3,7)间即part,grade,ID(作为合计时计为1)0,0,00,0,10,1,11,1,1而对于cube(part,grade,ID),grouping_id(part,grade,ID)的值范围在0-7之间即part,grade,ID(作为合计时计为1)0,0,00,0,10,1,00,1,11,0,01,0,11,1,0CREATE TEST TABLE AND INSERT TEST DATA.create table students(id number(15,0),area varchar2(10),stu_type varchar2(2),score number(20,2));insert into students values(1, '111', 'g', 80 ); insert into students values(1, '111', 'j', 80 ); insert into students values(1, '222', 'g', 89 ); insert into students values(1, '222', 'g', 68 ); insert into students values(2, '111', 'g', 80 ); insert into students values(2, '111', 'j', 70 ); insert into students values(2, '222', 'g', 60 ); insert into students values(2, '222', 'j', 65 ); insert into students values(3, '111', 'g', 75 ); insert into students values(3, '111', 'j', 58 ); insert into students values(3, '222', 'g', 58 ); insert into students values(3, '222', 'j', 90 ); insert into students values(4, '111', 'g', 89 ); insert into students values(4, '111', 'j', 90 ); insert into students values(4, '222', 'g', 90 ); insert into students values(4, '222', 'j', 89 ); commit;col score format 999999999999.99ROLLUPselect id,area,stu_type,sum(score) scorefrom studentsgroup by rollup(id,area,stu_type)order by id,area,stu_type;/*--------理解rollupselect a, b, c, sum( d )from tgroup by rollup(a, b, c);等效于select * from (select a, b, c, sum( d ) from t group by a, b, c union allselect a, b, null, sum( d ) from t group by a, b union allselect a, null, null, sum( d ) from t group by aunion allselect null, null, null, sum( d ) from t)*/CUBEselect id,area,stu_type,sum(score) scorefrom studentsgroup by cube(id,area,stu_type)order by id,area,stu_type;/*--------理解cubeselect a, b, c, sum( d ) from tgroup by cube( a, b, c)等效于select a, b, c, sum( d ) from tgroup by grouping sets(( a, b, c ),( a, b ), ( a ), ( b, c ),( b ), ( a, c ), ( c ),() ))*/GROUPING从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null,如何来区分到底是根据那个字段做的汇总呢,grouping函数判断是否合计列!select decode(grouping(id),1,'all id',id) id,decode(grouping(area),1,'all area',to_char(area)) area,decode(grouping(stu_type),1,'all_stu_type',stu_type) stu_type, sum(score) scorefrom studentsgroup by cube(id,area,stu_type)order by id,area,stu_type;。

相关文档
最新文档