вівторок, 14 квітня 2015 р.

ROLLUP и CUBE


Есть таблица emp
select deptno, empno, ename, job, sal
from emp order by deptno, empno;
DEPTNOEMPNOENAMEJOBSAL
-------------------------------------
107782CLARKMANAGER2450
107839KINGPRESIDENT5000
107934MILLERCLERK1300
207369SMITHCLERK800
207566JONESMANAGER2975
207788SCOTTANALYST3000
207876ADAMSCLERK1100
207902FORDANALYST3000
307499ALLENSALESMAN1600
307521WARDSALESMAN1250
307654MARTINSALESMAN1250
307698BLAKEMANAGER2850
307844TURNERSALESMAN1500
307900JAMESCLERK950


требуеться вывести итоги по подразделениям:
select deptno, count(*)
from emp
group by deptno
union
select to_number(null), count(*)
from emp;

DEPTNOCOUNT(*)
----------------
103
205
306

14



 можно использовать опцию ROLLUP, чтобы достигнуть того же самого результата:
select deptno, count(*)
from emp
group by rollup(deptno);

DEPTNOCOUNT(*)
----------------
103
205
306

14


Функция ROLLUP, может работать на нескольких столбцах. Результат многоуровнего действия rollup демонстрируется ниже:
select deptno, job, count(*), grouping(deptno), grouping(job)
from emp
group by rollup(deptno, job);
DEPTNOJOBCOUNT(*)GROUPING
(DEPTNO)
GROUPING
(JOB)
----------------------------------------
10CLERK100
10MANAGER100
10PRESIDENT100
10

301
20ANALYST200
20CLERK200
20MANAGER100
20

501
30CLERK100
30MANAGER100
30SALESMAN400
30

601


1411


функция GROUPING возвращает значение 1, если строка - это подытог, созданная ROLLUP или CUBE, и 0 в противном случае.


CUBE группирует данные по нескольким измерениям. В частности, она суммирует данные, которые явно наличествуют в столбцах, специфицированных в фразе GROUP BY:

select deptno, job, count(*), grouping(deptno), grouping(job)
from emp
group by cube(deptno, job);
DEPTNOJOBCOUNT(*)GROUPING
(DEPTNO)
GROUPING
(JOB)
----------------------------------------
10CLERK100
10MANAGER100
10PRESIDENT100
10

301
20ANALYST200
20CLERK200
20MANAGER100
20

501
30CLERK100
30MANAGER100
30SALESMAN400
30

601

ANALYST210

CLERK410

MANAGER310

PRESIDENT110

SALESMAN410


1411
Вывод функции CUBE включает выходной листинггенерируемый ROLLUP. Дополнительно, она отображает число служащих по профессиям, независимо от номера отдела

Немає коментарів:

Дописати коментар