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 |