Есть таблица 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. Дополнительно, она отображает число служащих по профессиям, независимо от номера отдела
Немає коментарів:
Дописати коментар