Oracle中的grouping函数
时间: 2025-09-11 09:23:20 AIGC 浏览: 1
### Oracle 数据库中 `GROUPING` 函数的用法和功能
#### 1. 基本概念
`GROUPING` 函数用于区分由 `ROLLUP`、`CUBE` 或 `GROUPING SETS` 返回的特殊 `NULL` 值与普通列中的 `NULL` 值。它返回一个整数值,如果当前行为汇总行,则返回 `1`;否则返回 `0`[^4]。
#### 2. 功能说明
- 当使用 `ROLLUP`、`CUBE` 或 `GROUPING SETS` 进行分组时,结果集中可能会出现 `NULL` 值作为占位符,表示更高层次的汇总行。
- `GROUPING` 函数可以帮助识别这些特殊的 `NULL` 值,从而区分汇总行与普通行。
#### 3. 示例代码
以下是一个使用 `GROUPING` 函数的示例:
```sql
SELECT
department_id,
job_id,
COUNT(*) AS employee_count,
GROUPING(department_id) AS dept_grouping,
GROUPING(job_id) AS job_grouping
FROM employees
GROUP BY ROLLUP(department_id, job_id);
```
- 查询结果将包括以下内容:
- 按 `(department_id, job_id)` 分组的结果。
- 按 `(department_id)` 分组的结果。
- 全表的总计行。
- `dept_grouping` 和 `job_grouping` 列分别表示 `department_id` 和 `job_id` 是否为汇总行。
| department_id | job_id | employee_count | dept_grouping | job_grouping |
|---------------|--------|----------------|---------------|--------------|
| 10 | CLERK | 5 | 0 | 0 |
| 10 | MANAGER| 2 | 0 | 0 |
| 10 | NULL | 7 | 0 | 1 |
| 20 | CLERK | 3 | 0 | 0 |
| 20 | MANAGER| 1 | 0 | 0 |
| 20 | NULL | 4 | 0 | 1 |
| NULL | NULL | 11 | 1 | 1 |
- 在结果中,`dept_grouping` 和 `job_grouping` 列帮助区分了普通行与汇总行。例如,`(10, NULL)` 表示部门 `10` 的总计,而 `(NULL, NULL)` 表示全表的总计[^4]。
#### 4. 结合 `GROUPING SETS` 使用
`GROUPING` 函数也可以与 `GROUPING SETS` 结合使用,以生成更复杂的汇总报表。
```sql
SELECT
department_id,
job_id,
COUNT(*) AS employee_count,
GROUPING(department_id) AS dept_grouping,
GROUPING(job_id) AS job_grouping
FROM employees
GROUP BY GROUPING SETS (
(department_id, job_id),
(department_id),
()
);
```
- 查询结果将包括以下分组:
- 按 `(department_id, job_id)` 分组的结果。
- 按 `(department_id)` 分组的结果。
- 全表的总计行。
- `GROUPING` 函数同样用于区分汇总行与普通行[^3]。
#### 5. 实际应用场景
`GROUPING` 函数在需要区分汇总行与普通行的场景中非常有用,例如财务报表、销售数据分析等。通过结合 `ROLLUP`、`CUBE` 或 `GROUPING SETS`,可以在一个查询中同时获取详细数据和汇总数据。
---
###
阅读全文
相关推荐


















