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 |