Есть таблица emp
select deptno, empno, ename, job, sal
from emp order by deptno, empno;
from emp order by deptno, empno;
| DEPTNO | EMPNO | ENAME | JOB | SAL |
| -------- | -------- | -------- | -------- | ----- |
| 10 | 7782 | CLARK | MANAGER | 2450 |
| 10 | 7839 | KING | PRESIDENT | 5000 |
| 10 | 7934 | MILLER | CLERK | 1300 |
| 20 | 7369 | SMITH | CLERK | 800 |
| 20 | 7566 | JONES | MANAGER | 2975 |
| 20 | 7788 | SCOTT | ANALYST | 3000 |
| 20 | 7876 | ADAMS | CLERK | 1100 |
| 20 | 7902 | FORD | ANALYST | 3000 |
| 30 | 7499 | ALLEN | SALESMAN | 1600 |
| 30 | 7521 | WARD | SALESMAN | 1250 |
| 30 | 7654 | MARTIN | SALESMAN | 1250 |
| 30 | 7698 | BLAKE | MANAGER | 2850 |
| 30 | 7844 | TURNER | SALESMAN | 1500 |
| 30 | 7900 | JAMES | CLERK | 950 |
требуеться вывести итоги по подразделениям:
select deptno, count(*)
from emp
group by deptno
union
select to_number(null), count(*)
from emp;
from emp
group by deptno
union
select to_number(null), count(*)
from emp;
| DEPTNO | COUNT(*) |
| -------- | -------- |
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
| 14 |
можно использовать опцию ROLLUP, чтобы достигнуть того же самого результата:
select deptno, count(*)
from emp
group by rollup(deptno);
from emp
group by rollup(deptno);
| DEPTNO | COUNT(*) |
| -------- | -------- |
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
| 14 |
Функция ROLLUP, может работать на нескольких столбцах. Результат многоуровнего действия rollup демонстрируется ниже:
select deptno, job, count(*), grouping(deptno), grouping(job)
from emp
group by rollup(deptno, job);
from emp
group by rollup(deptno, job);
| DEPTNO | JOB | COUNT(*) | GROUPING (DEPTNO) | GROUPING (JOB) |
| -------- | -------- | -------- | -------- | -------- |
| 10 | CLERK | 1 | 0 | 0 |
| 10 | MANAGER | 1 | 0 | 0 |
| 10 | PRESIDENT | 1 | 0 | 0 |
| 10 | 3 | 0 | 1 | |
| 20 | ANALYST | 2 | 0 | 0 |
| 20 | CLERK | 2 | 0 | 0 |
| 20 | MANAGER | 1 | 0 | 0 |
| 20 | 5 | 0 | 1 | |
| 30 | CLERK | 1 | 0 | 0 |
| 30 | MANAGER | 1 | 0 | 0 |
| 30 | SALESMAN | 4 | 0 | 0 |
| 30 | 6 | 0 | 1 | |
| 14 | 1 | 1 |
функция GROUPING возвращает значение 1, если строка - это подытог, созданная ROLLUP или CUBE, и 0 в противном случае.
CUBE группирует данные по нескольким измерениям. В частности, она суммирует данные, которые явно наличествуют в столбцах, специфицированных в фразе GROUP BY:
select deptno, job, count(*), grouping(deptno), grouping(job)
from emp
group by cube(deptno, job);
from emp
group by cube(deptno, job);
| DEPTNO | JOB | COUNT(*) | GROUPING (DEPTNO) | GROUPING (JOB) |
| -------- | -------- | -------- | -------- | -------- |
| 10 | CLERK | 1 | 0 | 0 |
| 10 | MANAGER | 1 | 0 | 0 |
| 10 | PRESIDENT | 1 | 0 | 0 |
| 10 | 3 | 0 | 1 | |
| 20 | ANALYST | 2 | 0 | 0 |
| 20 | CLERK | 2 | 0 | 0 |
| 20 | MANAGER | 1 | 0 | 0 |
| 20 | 5 | 0 | 1 | |
| 30 | CLERK | 1 | 0 | 0 |
| 30 | MANAGER | 1 | 0 | 0 |
| 30 | SALESMAN | 4 | 0 | 0 |
| 30 | 6 | 0 | 1 | |
| ANALYST | 2 | 1 | 0 | |
| CLERK | 4 | 1 | 0 | |
| MANAGER | 3 | 1 | 0 | |
| PRESIDENT | 1 | 1 | 0 | |
| SALESMAN | 4 | 1 | 0 | |
| 14 | 1 | 1 |
Вывод функции CUBE включает выходной листинг, генерируемый ROLLUP. Дополнительно, она отображает число служащих по профессиям, независимо от номера отдела
Немає коментарів:
Дописати коментар