PostgreSQL ZESTAWY GRUPUJĄCE

author
3 minutes, 10 seconds Read

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

.

Similar Posts

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.