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操作。
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_type做group 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_type,trade_date,deal_sub_type);这个不用解释,上图很明显。
#2.(deal_type,trade_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. 使用grouping和grouping_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;
相关推荐
对于更复杂的字符串连接,比如构建树状结构,可以使用`CONNECT BY`子句和`PRIOR`关键字。这在处理层次数据时非常有用。例如: ```sql SELECT SYS_CONNECT_BY_PATH(column, '/') AS path FROM table_name START ...
本文介绍了在Oracle数据库中处理重复数据的几种方法。无论是部分字段重复还是完全重复的记录,都可以通过创建临时表的方式提高删除重复记录的效率。此外,在处理重复数据时,还应考虑到保留最新或最旧记录的需求,...
下面我们将详细介绍几种常见的方法。 方法一:使用 Having 子句 第一种方法是使用 Having 子句来查询重复数据。这种方法可以根据单个字段或多个字段来判断重复记录。例如,下面的语句可以查询出表中多余的重复记录...
- 在 MySQL 中,组函数(如 COUNT、SUM 等)可以在 SELECT 语句中与非聚合列一起使用,但 Oracle 要求如果使用了组函数,其他列要么也使用组函数处理,要么出现在 GROUP BY 子句中。例如,`SELECT name, COUNT...
本文将详细介绍几种常用的查询和删除Oracle数据库中重复记录的方法。 #### 一、查询重复数据 1. **使用ROWID** ROWID是Oracle提供的一种特殊数据类型,它表示表中行的物理地址。通过ROWID可以快速定位到表中的某...
以下将详细介绍几种常见的分组方法及其应用。 1. **按年份分组**: 使用`to_char()`函数将日期字段转换为年份格式,并结合`GROUP BY`子句进行分组。例如: ```sql SELECT to_char(exportDate, 'yyyy'), SUM(amount) ...
这是最常用的方法之一,通过GROUP BY子句和HAVING子句,可以找出重复记录并删除它们。 ```sql delete from tbl where (col1, col2) in ( select col1, col2 from tbl group by col1, col2 having count(*) > 1 ) ...
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 ...
为了确保结果的准确性,Oracle要求每个非聚合列必须被包含在`GROUP BY`子句中或作为聚合函数的一部分。 #### 二、序列(Sequence)的创建和使用 在数据库设计中,序列(Sequence)是一种用于自动生成唯一编号的...
在Oracle数据库中,删除表中的数据有几种不同的方法:`TRUNCATE TABLE`、`DROP TABLE` 和 `DELETE FROM`。这三种方法各有其适用场景和注意事项: - **TRUNCATE TABLE**: - 该命令能够快速地清空表中的所有数据,...
本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`collections`),并提供具体的示例来帮助理解。 ### 1. 使用`UNION ALL`进行行列转换 `UNION ALL`是一种简单直接的...
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 数据控制 ...
- **基于规则的优化器(Rule-Based Optimizer, RBO)**: 早期版本的Oracle使用的一种简单的优化策略。 - **基于成本的优化器(Cost-Based Optimizer, CBO)**: 当前版本默认使用的优化器,它基于统计信息来选择最高效的...
当需要查找表中的重复记录时,可以采用以下几种方法: 1. **Group By与Having子句** ```sql SELECT * FROM cz GROUP BY c1, c10, c20 HAVING COUNT(*) > 1; ``` 这条SQL语句通过`GROUP BY`对指定列进行分组,并...
4. 查询数据(SELECT):熟练掌握SELECT语句,包括选择列、过滤行(WHERE子句)、排序(ORDER BY子句)、分组(GROUP BY子句)和聚合函数(COUNT、SUM、AVG等)。 5. 更新数据(UPDATE):了解如何修改已存在于表中...
4. **GROUP BY子句**:用于分组数据。在这里,数据按照`info_id`进行分组,这是行列转换的基础,确保每个`info_id`对应的数据被正确地转换和聚合。 5. **ORDER BY子句**:用于排序结果集。这里的`ORDER BY temp....
文档中提到了几种常见的数据类型,例如VARCHAR2、NUMBER、DATE、BLOB等。其中特别指出BLOB类型的使用应当谨慎,因为它主要用于存储大对象,可能会影响性能。 #### 十、数据操作 (DML) - **插入多条数据**:可以通过...
Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且能够返回多个结果行。这与传统的聚合函数(如`SUM`、`COUNT`等)形成鲜明对比,后者通常只针对每一组返回单一的结果行。自Oracle 8.1.6...