Operacje rozszerzające grupowania group by

kasiaKasia

Rozszerzenie grupowania group by standardu SQL są między innymi:
cube,
rollup,
gruping,
grouping sets

Operatory należą do operacji agregujących.

Operator ROLLUP wyszukuje określoną część skumulowanych agregatów. Wyświetla podsumowanie na n+1 poziomach (n – liczba kolumn grupowanych, 1- to podsumowanie całkowite ) Zapytanie ROLLUP jest równoważne wielokrotnemu zapisu group by.
Składnia:

SELECT column_lis, group_funcion (column)
	FROM table 
		[WHERE condition]
		[GROUP BY [ROLLUP] group_by_expression ]
			[HAVING having_expression]
			[ORDER BY column]

Przykład 1:

SELECT job, department, sum(salary) 
FROM employee 
GROUP BY  ROLLUP(job, department);
Job Department sum(salary)
Monter 3 3000
Monter 5 3000
Monter 6000
Wykładowca 4 3000
Wykładowca 3000
Programista 1 12000
Programista 12000
Administrator 2 5000
Administrator 5000
Account Manager 2 3000
Account Manager 3000
29000
Powyższy przykład zwraca w jednym przebiegu sumy wypłaty (salary) w ramach stanowiska (job) w rożnych działach (department), w ramach stanowiska oraz w ramach całej firmy.

Operator CUBE wyszukuje skumulowane agregaty dla wszystkich możliwych kombinacji grupowań
Składnia:

SELECT 	column_lis, group_funcion (column)
	FROM table 
		[WHERE condition]
		[GROUP BY [CUBE] group_by_expression ]
			[HAVING having_expression]
			[ORDER BY column]

Przykład 1:

SELECT department, job, sum(salary), grouping(department),grouping(job)
FROM employee 
GROUP BY  CUBE( department,job)
ORDER BY department,job ;
Department Job sum(salary) grouping(department) grouping(job)
1 Programista 12000 0 0
1 12000 0 1
2 Account Manager 3000 0 0
2 Administrator 5000 0 0
2 8000 0 1
3 Monter 3000 0 0
3 3000 0 1
4 Wykładowca 3000 0 0
4 3000 0 1
5 Monter 3000 0 0
5 3000 0 1
Account Manager 3000 1 0
Administrator 5000 1 0
Monter 6000 1 0
Programista 12000 1 0
Wykładowca 3000 1 0
29000 1 1

Powyższy przykład zwraca w jednym przebiegu sumy wypłaty (salary) w ramach stanowiska (job) w dziale (department), w ramach stanowiska, w ramach departamentu, w ramach całej firmy.

Operator GROUPING pozwala rozróżnić informację zwracane dzięki operatorom cube i rollup (zwraca 1), a także od danych objętych operatorem group by (zwraca 0)
Składnia:

SELECT column_lis, group_funcion (column)
GROUPING (expr)
FROM table 
		[WHERE condition]
		[GROUP BY [ {ROLLUP | CUBE}] 
		group_by_expression ]
			[HAVING having_expression]
			[ORDER BY column]

GROUPING SETS umożliwia jawną specyfikację żądanych poziomów agregacji, eliminując przetwarzanie pozostałych, zbędnych poziomów

Przykład 1:

SELECT  first_name || ' ' || last_name as first_name_last_name, department, job, sum(salary)
FROM employee 
GROUP BY GROUPING SETS (
   (first_name || ' ' || last_name), (department, job)
);
first_name_last_name department job sum(salary)
2 Administrator 5000
4 Wykładowca 3000
5 Monter 3000
2 Account Manager 3000
1 Programista 12000
3 Monter 3000
test test 3000
Ola Balicka 3000
Patryk Rosa 5000
Michał Kowalski 3000
Kasia Nowak 6000
Robert Znak 3000
Wiktor Tatarski 3000
Karol Sok 3000

0 komentarzy