Podsumowanie: W tym tutorialu poznasz koncepcję zestawów grupujących oraz dowiesz się, jak używać klauzuli PostgreSQL GROUPING SETS
do generowania wielu zestawów grupujących w zapytaniu.
Ustawienie przykładowej tabeli
Zacznijmy od utworzenia nowej tabeli o nazwiesales
dla celów demonstracyjnych.
Code language: SQL (Structured Query Language) (sql)
Tabela sales
przechowuje liczbę sprzedanych produktów według marki i segmentu.
Wprowadzenie do PostgreSQL ZESTAWY GRUPUJĄCE
Zestaw grupujący to zestaw kolumn, według których grupujemy za pomocą klauzuli GROUP BY
.
Zestaw grupujący jest oznaczany przez oddzieloną przecinkami listę kolumn umieszczonych wewnątrz nawiasów:
Na przykład poniższe zapytanie wykorzystuje klauzulę GROUP BY
, aby zwrócić liczbę sprzedanych produktów według marki i segmentu. Innymi słowy, definiuje ono zbiór grupujący markę i segment, który jest oznaczany przez (brand, segement)
Code language: SQL (Structured Query Language) (sql)
Następujące zapytanie znajduje liczbę produktów sprzedanych przez markę. Definiuje ono zbiór grupujący (brand)
:
Code language: SQL (Structured Query Language) (sql)
Następujące zapytanie znajduje liczbę produktów sprzedawanych przez segment. Definiuje ono zbiór grupujący (segment)
:
Code language: SQL (Structured Query Language) (sql)
Następujące zapytanie znajduje liczbę sprzedanych produktów dla wszystkich marek i segmentów. Definiuje ono pusty zbiór grupujący, który jest oznaczany przez ()
.
Code language: SQL (Structured Query Language) (sql)
Załóżmy, że chcesz uzyskać wszystkie zbiory grupujące za pomocą jednego zapytania. Aby to osiągnąć, możesz użyć UNION ALL
do połączenia wszystkich powyższych zapytań.
Ponieważ UNION ALL
wymaga, aby wszystkie zestawy wyników miały tę samą liczbę kolumn o zgodnych typach danych, musisz dostosować zapytania, dodając NULL
do listy wyboru każdego z nich, jak pokazano poniżej:
Code language: SQL (Structured Query Language) (sql)
To zapytanie wygenerowało pojedynczy zestaw wyników z agregatami dla wszystkich zestawów grupujących.
Mimo że powyższe zapytanie działa zgodnie z Twoimi oczekiwaniami, ma dwa główne problemy.
- Po pierwsze, jest dość długie.
- Po drugie, ma problem z wydajnością, ponieważ PostgreSQL musi skanować tabelę
sales
osobno dla każdego zapytania.
Aby zwiększyć wydajność, PostgreSQL udostępnia klauzulę GROUPING SETS
, która jest podklauzulą klauzuli GROUP BY
.
Klauzula GROUPING SETS
pozwala na zdefiniowanie wielu zestawów grupujących w tym samym zapytaniu.
Ogólna składnia klauzuli GROUPING SETS
jest następująca:
Code language: SQL (Structured Query Language) (sql)
W tej składni mamy cztery zestawy grupujące (c1,c2)
, (c1)
, (c2)
i ()
.
Aby zastosować tę składnię do powyższego przykładu, możesz użyć klauzuli GROUPING SETS
zamiast klauzuli UNION ALL
w następujący sposób:
Code language: SQL (Structured Query Language) (sql)
To zapytanie jest znacznie krótsze i bardziej czytelne. Dodatkowo PostgreSQL zoptymalizuje ilość razy skanowania tabeli sales
i nie będzie skanować wielokrotnie.
Funkcja grupująca
Funkcja GROUPING()
przyjmuje argument, którym może być nazwa kolumny lub wyrażenie:
Klauzula column_name
lub expression
musi być zgodna z określoną w klauzuli GROUP BY
.
Funkcja GROUPING()
zwraca bit 0, jeśli argument jest członkiem bieżącego zestawu grupującego, a 1 w przeciwnym razie.
Zobacz następujący przykład:
Code language: SQL (Structured Query Language) (sql)
Jak pokazano na zrzucie ekranu, gdy wartość w polu grouping_brand
wynosi 0, w kolumnie sum
wyświetlana jest suma częściowa brand
.
Gdy wartość w polu grouping_segment
wynosi zero, w kolumnie suma wyświetlana jest suma częściowa segment
.
Możesz użyć funkcji GROUPING()
w klauzuli HAVING
, aby znaleźć sumę częściową każdej marki w następujący sposób:
W tym poradniku dowiedziałeś się, jak korzystać z funkcji PostgreSQL GROUPING SETS
do generowania wielu zestawów grupujących.
- Czy ten kurs był pomocny ?
- TakNie
.