Bazy danych

Operacje rozszerzające grupowania group by

  • 2013-03-03 12:41
  • 0 komentarzy
  • 1398 odsłon
  • Oceń ten tekst jako pierwszy
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);


JobDepartmentsum(salary)
Monter33000
Monter53000
Monter6000
Wykładowca43000
Wykładowca3000
Programista112000
Programista12000
Administrator25000
Administrator5000
Account Manager23000
Account Manager3000
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 ;


DepartmentJobsum(salary)grouping(department)grouping(job)
1Programista1200000
11200001
2Account Manager300000
2Administrator500000
2800001
3Monter300000
3300001
4Wykładowca300000
4300001
5Monter300000
5300001
Account Manager300010
Administrator500010
Monter600010
Programista1200010
Wykładowca300010
2900011


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_namedepartmentjobsum(salary)
2Administrator5000
4Wykładowca3000
5Monter3000
2Account Manager3000
1Programista12000
3Monter3000
test test3000
Ola Balicka3000
Patryk Rosa5000
Michał Kowalski3000
Kasia Nowak6000
Robert Znak3000
Wiktor Tatarski3000
Karol Sok3000