`

oracle group by子句的几种用法

 
阅读更多

OracleGROUP BY语句除了最基本的语法外,还支持ROLLUPCUBE语句。

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

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

 

 

1.       普通的group by

select trade_date, deal_type, sum(turnover)

             from test t

 where t.trade_date >= date '2013-08-10'

 group by trade_date, deal_type;

 

 

 

 

 

 

2.       使用group by rollup()单列

select trade_date, sum(turnover)

                from test t

               where t.trade_date >= date '2013-08-10'

        group by rollup(trade_date);

 

 

 

   

 可以看到,在最后一行做了汇总。

 

3.       使用group by rollup()多列

select trade_date, deal_type, sum(turnover)

               from test t

 where t.trade_date >= date '2013-08-10'

 group by rollup(trade_date, deal_type);  

 

 

 



 从上图可以看到
:

#1.根据trade_date做了汇总;

#2.最后一行做了总的汇总。

按照rollup()的语法,是不会对deal_typegroup by的。上面的SQL做了(trade_date,deal_type)的group by;(trade_date)的group by;以及对全表进行group by 操作。

 

如果是rollup()3列呢?

select trade_date, deal_type, deal_sub_type, sum(turnover)

                from test t

               where t.trade_date >= date '2013-08-10'

               group by rollup(deal_type, trade_date, deal_sub_type)

        order by 1, 2, 3;

 

 

 

 

依次做了下面的group by操作:

#1.deal_typetrade_datedeal_sub_type);这个不用解释,上图很明显。

#2.deal_typetrade_date);第2行、第4行、第7行、第9行、第11行、第13行。

  #3.deal_type)。第14到第17行。

 第18行是总的一个汇总。

 

4.       使用cube()单列

select trade_date, sum(turnover)

                               from test t

                where t.trade_date >= date '2013-08-10'

         group by cube(trade_date);

 

 



 

 

rollup()对比,你会发现rollup()是在最后一行汇总,cube()是在第1行。

如果想在最后一行汇总,可以使用order by trade_date nulls last排序。

如下:

select trade_date, sum(turnover)

                               from test t

                where t.trade_date >= date '2013-08-10'

                group by cube(trade_date)

   order by trade_date nulls last;

 

 

5.       使用cube()多列

select trade_date, deal_type, sum(turnover)

                from test t

               where t.trade_date >= date '2013-08-10'

               group by cube(trade_date, deal_type)

        order by 1 nulls last;

 

 

 

 

 

order by 1 nulls last”中的1当然指的就是你查询的第1列,即trade_date了。

通过上图我们可以发现这样几点:

#1.对整体group by了。

#2.trade_date进行group by了。

#3.deal_type进行group by了。

#4.对整体进行汇总。

6.       使用groupinggrouping_id来标记group by的结果

select grouping(trade_date),

                                                                trade_date,

                                                                grouping(deal_type),

                                                                deal_type,

                                                                sum(turnover)

                               from test t

                where t.trade_date >= date '2013-08-10'

                group by cube(trade_date, deal_type)

         order by 1 nulls last;

               



 

 

通过上图你可以发现,如果列的值为空,则显示的值为1;否则显示的0.

显示为1的就是合计的列,由此我们可以使用grouping_id来标识group by后的结果。

select decode(grouping_id(trade_date), 1, '合计', trade_date),

                                                                               decode(grouping_id(deal_type), 1, '合计', deal_type),

                                                                               sum(turnover)

                                from test t

                               where t.trade_date >= date '2013-08-10'

                               group by cube(trade_date, deal_type)

                        order by 1 nulls last;

 

 

 

原来合计的列显示的空白,现在都显示的“合计”。

7.       使用grouping sets

select trade_date, deal_type, sum(turnover)

                               from test t

                where t.trade_date >= date '2013-08-10'

                group by grouping sets(trade_date, deal_type)

         order by 1 nulls last;


 

 

 

你可以看到,上面的效果不正等同于使用union all吗?

select trade_date, null, sum(turnover)

                                from test t

                               where t.trade_date >= date '2013-08-10'

                               group by trade_date

                union all

                select null, deal_type, sum(turnover)

                                from test t

                               where t.trade_date >= date '2013-08-10'

                        group by deal_type;

 

  • 大小: 3.5 KB
  • 大小: 2.2 KB
  • 大小: 4.9 KB
  • 大小: 7.4 KB
  • 大小: 2.7 KB
  • 大小: 2.3 KB
  • 大小: 6.3 KB
  • 大小: 8.1 KB
  • 大小: 7.3 KB
  • 大小: 4 KB
分享到:
评论

相关推荐

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    1.5.3 GROUP BY子句 11 1.5.4 HAVING子句 12 1.5.5 SELECT列表 12 1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 ...

    Oracle11g从入门到精通2

    3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 ...

    Oracle11g从入门到精通

    3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

    Oracle.11g.从入门到精通 (2/2)

    3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 3.5.2...

    Oracle.11g.从入门到精通 (1/2)

    3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 3.5.2...

    oracle实验报告

    (1) 了解Oracle的工作环境和基本使用方法。 (2) 练习标准SQL的数据操作,查询命令及其查询优化。 (3) 学会使用高级SQL命令,排序、分组、自连接查询等。 (4) 学会使用SQL*PLUS命令显示报表,存储到文件等。 【实验...

    Oracle事例

    20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); <2> 对第1个字段...

    2009达内SQL学习笔记

    ORDER BY子句中使用的列将是为显示所选择的列,但是实际上并不一定要这样,用非检索的列排序数据是完全合法的。 为了按多个列排序,列名之间用逗号分开。 2、支持按相对列位置进行排序。 输入 SELECT prod_id,...

    Oracle9i的init.ora参数中文说明

    说明: 指定 Oracle 使用哪种日历系统作为日期格式。例如, 如果 NLS_CALENDAR 设置为 'Japanese Imperial', 那么日期格式为 'E YY-MM-DD'。即: 如果日期是 1997 年 5 月 15 日, 那么 SYSDATE 显示为 'H 09-05-15'。 ...

    C#开发经验技巧宝典

    0853 如何使用GROUP BY子句查询 509 0854 如何使用HAVING语句过滤分组数据 510 0855 如何使用ALL关键字查询 510 0856 如何使用CUBE关键字查询 511 19.4 表结构与性能 511 0857 检测信息是否存在 511 ...

    经典全面的SQL语句大全

    这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码): SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"  注意:以上...

    mysql数据库的基本操作语法

    注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改 但是MySQL可以通过多个modify的方式完成: alter table user modify tel varchar(15) default '02087654321' first, modify name varchar(20) ...

    SQL语法大全

    3. SQL常用命令使用方法: (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]" ...

    C#编程经验技巧宝典

    24 <br>0050 using关键字的用法 24 <br>0051 变量的作用域 25 <br>2.5 其他 26 <br>0052 有效使用this对象 26 <br>0053 如何声明变量 26 <br>0054 如何声明相同类型的多个变量 26 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例133 使用方法实现线程同步 172 实例134 使用代码块实现线程同步 174 实例135 使用特殊域变量实现线程同步 175 实例136 使用重入锁实现线程同步 176 实例137 使用线程局部变量实现线程同步 177 实例138 简单的...

Global site tag (gtag.js) - Google Analytics