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