- 浏览: 7495 次
- 性别:
- 来自: 上海
最近访客 更多访客>>
文章分类
- 全部博客 (8)
- Arithmetic (0)
- C/C++ (1)
- Excel (3)
- JAVA (0)
- Oracle (3)
- Command Prompt (0)
- Javascript (0)
- TCP/IP (0)
- Tools (0)
- VB (0)
- C# (0)
- Objective-C (0)
- Andriod (0)
- SQL Server (0)
- MySQL (0)
- Shell (0)
- CSS (0)
- HTML5 (0)
- XML (0)
- PHP (0)
- Python (1)
- perl (0)
- Ruby (0)
- Scala (0)
- 网络编程 (0)
- Hadoop (0)
- Groovy (0)
- 设计模式 (0)
- UML (0)
- webservice (0)
- Ajax (0)
- COM/COM+ (0)
- windows API (0)
- Struts (0)
- Hibernate (0)
- Spring (0)
- Mybatis (0)
- Linux (0)
- Unix (0)
- Apache (0)
- AspectJ (0)
最新评论
可以使用GROUPING_ID函数借助HAVING子句对记录进行过滤,将不包含小计或者总计的记录除去。GROUPING_ID()函数可以接受一列或多列,返回GROUPING位向量的十进制值。GROUPING位向量的计算方法是将按照顺序对每一列调用GROUPING函数的结果组合起来。
关于GROUPING函数的使用方法可以参见我前面写的一篇文章
http://blog.csdn.net/wh62592855/archive/2009/11/16/4818072.aspx
1、GROUPING_ID用法实例
SQL> select
2 division_id,job_id,
3 grouping(division_id) as div_grp,
4 grouping(job_id) as job_grp,
5 grouping_id(division_id,job_id) as grp_id,
6 sum(salary)
7 from employees2
8 group by cube(division_id,job_id)
9 order by division_id,job_id;
DIV JOB DIV_GRP JOB_GRP GRP_ID SUM(SALARY)
--- --- ---------- ---------- ---------- -----------
BUS MGR 0 0 0 530000
BUS PRE 0 0 0 800000
BUS WOR 0 0 0 280000
BUS 0 1 1 1610000
OPE ENG 0 0 0 245000
OPE MGR 0 0 0 805000
OPE WOR 0 0 0 270000
OPE 0 1 1 1320000
SAL MGR 0 0 0 4446000
SAL WOR 0 0 0 490000
SAL 0 1 1 4936000
DIV JOB DIV_GRP JOB_GRP GRP_ID SUM(SALARY)
--- --- ---------- ---------- ---------- -----------
SUP MGR 0 0 0 465000
SUP TEC 0 0 0 115000
SUP WOR 0 0 0 435000
SUP 0 1 1 1015000
ENG 1 0 2 245000
MGR 1 0 2 6246000
PRE 1 0 2 800000
TEC 1 0 2 115000
WOR 1 0 2 1475000
1 1 3 8881000
21 rows selected.
2、GOURPING位向量计算
如上例所示
division_id job_id 位向量 GROUPING_ID()返回值
非空 非空 00 0
非空 空 01 1
空 非空 10 2
空 空 11 3
3、GROUPING_ID()的用武之地
GROUPING_ID()的一个用武之地在于使用HAVING子句过滤记录。HAVING子句可以将不包含小计或总计的记录除去,这只要通过简单的检查GROUPING_ID()的返回值,看其是否大于零就可以实现。
SQL> select
2 division_id,job_id,
3 grouping_id(division_id,job_id) as grp_id,
4 sum(salary)
5 from employees2
6 group by cube(division_id,job_id)
7 having grouping_id(division_id,job_id) > 0
8 order by division_id,job_id;
DIV JOB GRP_ID SUM(SALARY)
--- --- ---------- -----------
BUS 1 1610000
OPE 1 1320000
SAL 1 4936000
SUP 1 1015000
ENG 2 245000
MGR 2 6246000
PRE 2 800000
TEC 2 115000
WOR 2 1475000
3 8881000
10 rows selected.
4、在GROUP BY子句中多次使用一个列
在GROUP BY子句中可以多次使用某个列,这样可以实现对数据的重新组织,或是按照不同的数据分组进行统计。例如,下面这个查询中包含一个GROUP BY子句,其中使用了两次division_id列,第一次是对division_id进行分组,第二次是在ROLLUP中使用。
SQL> select division_id,job_id,sum(salary)
2 from employees2
3 group by division_id,rollup(division_id,job_id);
DIV JOB SUM(SALARY)
--- --- -----------
BUS MGR 530000
BUS PRE 800000
BUS WOR 280000
OPE ENG 245000
OPE MGR 805000
OPE WOR 270000
SAL MGR 4446000
SAL WOR 490000
SUP MGR 465000
SUP TEC 115000
SUP WOR 435000
DIV JOB SUM(SALARY)
--- --- -----------
BUS 1610000
OPE 1320000
SAL 4936000
SUP 1015000
BUS 1610000
OPE 1320000
SAL 4936000
SUP 1015000
19 rows selected.
但是需要注意,最后四行记录和前面四行记录是重复的。这种重复现象可以通过使用GROUP_ID()来消除。
5、使用GROUP_ID函数
GROUP_ID函数可用于消除GROUP BY子句返回的重复记录。GROUP_ID()不接受任何参数。如果某个特定的分组重复出现n次,那么GROUP_ID()返回从0到n-1之间的一个整数。下面我们重写上面那个例子
SQL> select division_id,job_id,group_id(),sum(salary)
2 from employees2
3 group by division_id,rollup(division_id,job_id);
DIV JOB GROUP_ID() SUM(SALARY)
--- --- ---------- -----------
BUS MGR 0 530000
BUS PRE 0 800000
BUS WOR 0 280000
OPE ENG 0 245000
OPE MGR 0 805000
OPE WOR 0 270000
SAL MGR 0 4446000
SAL WOR 0 490000
SUP MGR 0 465000
SUP TEC 0 115000
SUP WOR 0 435000
DIV JOB GROUP_ID() SUM(SALARY)
--- --- ---------- -----------
BUS 0 1610000
OPE 0 1320000
SAL 0 4936000
SUP 0 1015000
BUS 1 1610000
OPE 1 1320000
SAL 1 4936000
SUP 1 1015000
19 rows selected.
可以通过HAVING子句来消除重复记录,只返回GROUP_ID()等于0的记录。
SQL> select division_id,job_id,group_id(),sum(salary)
2 from employees2
3 group by division_id,rollup(division_id,job_id)
4 having group_id()=0;
DIV JOB GROUP_ID() SUM(SALARY)
--- --- ---------- -----------
BUS MGR 0 530000
BUS PRE 0 800000
BUS WOR 0 280000
OPE ENG 0 245000
OPE MGR 0 805000
OPE WOR 0 270000
SAL MGR 0 4446000
SAL WOR 0 490000
SUP MGR 0 465000
SUP TEC 0 115000
SUP WOR 0 435000
DIV JOB GROUP_ID() SUM(SALARY)
--- --- ---------- -----------
BUS 0 1610000
OPE 0 1320000
SAL 0 4936000
SUP 0 1015000
15 rows selected.
相关推荐
在Oracle数据库中,`GROUPING` 和 `GROUPING_ID` 是两种非常有用的函数,它们能够帮助用户更好地理解和组织聚合查询的结果。这两种函数主要用于处理复杂的分组情况,尤其是在使用`ROLLUP` 或 `CUBE` 时更为显著。...
《Pro Oracle SQL》一书的第七章第7.8节主要探讨了如何通过GROUPING_ID()函数来扩展Oracle SQL报告的功能。GROUPING_ID()在数据分析和报表生成中扮演着重要角色,尤其在处理分组数据时,能提供更详细的分组信息。本...
`GROUPING_ID`函数可以用来标识当前行属于哪个分组集,这对于解析结果集非常有用。 总的来说,`GROUP BY GROUPING SETS`在处理多维度分析时提供了强大的工具,允许我们定制汇总级别,同时保持查询性能的高效。它...
当我们需要更复杂的分组和汇总信息时,可以使用扩展的聚合功能,如ROLLUP、CUBE以及GROUPING()和GROUPING_ID()函数。这些功能允许我们生成多层次的总计和小计,为数据分析提供了极大的灵活性。 1. ROLLUP子句: ...
在Oracle数据库中,有时我们需要将同一列中的多个值合并成一个字符串,这时就可以使用`WM_CONCAT`函数。`WM_CONCAT`是一个非标准的Oracle函数,它在Oracle 9i及以后的版本中被广泛使用,但在Oracle 11g R2版本中由于...
#### 三、高级技巧:使用GROUPING_ID函数标识汇总行 为了更直观地区分汇总行和普通行,可以结合使用`GROUPING_ID`函数。`GROUPING_ID`函数返回一个整数值,该值标识了当前行是基于哪个字段的汇总。 示例如下: ``...
9. **GROUP_ID**,**GROUPING**,**GROUPING_ID**:用于多级分组统计,GROUP_ID返回唯一分组标识,GROUPING表示是否进行了分组,GROUPING_ID返回分组的位模式。 10. **MAX**,**MIN**:找出最大值和最小值。 11. **...
本篇文章将详细阐述Oracle分组函数的概念、功能以及常用分组函数的使用方法。 一、分组函数概述 分组函数主要作用于一组数据上,而不是单个记录,它们用于对数据进行汇总,如计算总和、平均值、最大值、最小值等。...
GROUPING()函数是Oracle数据库提供的一种特殊函数,用于识别汇总结果中的NULL值,并且在分组操作中有着独特的应用。 NULL值在SQL中表示未知或无值,它不同于任何具体的值,包括零、空字符串等。在进行GROUP BY语句...
- SQL Server独有的`GROUPING_ID()`用于确定分组级别,Oracle则使用`RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`等窗口函数来实现类似功能。 6. **条件函数** - `CASE`语句在两个数据库中都存在,用于基于条件进行...
其中使用了`ROLLUP`和`GROUPING`函数来实现对所有表空间或单个表空间的统计。 **示例查询:** ```sql SELECT Substr(Ta.Tablespace_Name, 1, 10) "空间名称", To_Char(Ta.Define_Size / 1048576, '999990.999') ...
decode(grouping_id(grade,ID),1,'小计',3,'合计',ID) ID, SUM(num) FROM a GROUP BY ROLLUP(grade,ID); 这条 SQL 语句将对 grade 和 id 字段进行分组,并生成子总计和总计。结果如下: GRADE ID SUM(NUM) -----...
在实际应用中,GROUPING ID是GROUPING函数的一个扩展,它提供了一种更直观的方式来识别多级分组。GROUPING ID返回一个数字,这个数字是一个二进制位表示的组合,每个位对应GROUP BY子句中的一个列,如果该列在当前...
- **功能**:GROUPING_ID函数用于标记由ROLLUP或CUBE产生的汇总结果,便于识别汇总级别。 - **示例**:在使用`GROUP BY ROLLUP(Category, Brand, Model), GROUPING_ID(Category, Brand, Model)`时,可以通过GROUPING...
同时,结合使用`GROUPING`和`GROUPING_ID`函数,可以让查询结果更易于理解和分析。这些功能对于进行复杂的数据分析和报告生成都非常有用。了解并熟练掌握这些功能对于Oracle数据库的开发人员来说至关重要。
- `GROUPING_ID`: 用于多级分组标识。 3. **分析函数**: 分析函数在聚合操作的基础上增加了行上下文,可用于窗口化操作。例如: - `RANK`, `DENSE_RANK`, `ROW_NUMBER`: 为每一行分配一个唯一的排名。 - `LAG`...
#### 分组函数(Grouping Functions) 分组函数用于对数据进行汇总统计,如计算平均值、最大值、最小值等。这些函数可以使用`DISTINCT`或`ALL`关键字来控制统计时使用的行数,默认情况下为`ALL`。 - **AVG...
Oracle特有的GROUP_ID函数可以为每个分组生成一个唯一的标识符。这对于需要在查询中引用特定分组时非常有用。 5. **GROUPING 函数**: GROUPING函数可以用来确定某个值是否是由于GROUP BY或GROUPING SETS产生的...