PostgreSQL GROUPING SETS

author
3 minutes, 30 seconds Read

Rezumat: în acest tutorial, veți învăța despre conceptul de set de grupare și cum să utilizați clauza PostgreSQL GROUPING SETS pentru a genera mai multe seturi de grupare într-o interogare.

Configurați un tabel de probă

Să începem prin a crea un tabel nou numitsales pentru demonstrație.

Code language: SQL (Structured Query Language) (sql)

Tabela sales stochează numărul de produse vândute în funcție de marcă și segment.

Introducere la PostgreSQL GRUPAREA SETURILOR

Un set de grupare este un set de coloane prin care se grupează cu ajutorul clauzei GROUP BY.

Un set de grupare este reprezentat de o listă de coloane separate prin virgulă, plasată între paranteze:

De exemplu, următoarea interogare utilizează clauza GROUP BY pentru a returna numărul de produse vândute în funcție de marcă și segment. Cu alte cuvinte, aceasta definește un set de grupare a mărcii și a segmentului care este notat cu (brand, segement)

Code language: SQL (Structured Query Language) (sql)

Următoarea interogare găsește numărul de produse vândute de o marcă. Se definește un set de grupare (brand):

Code language: SQL (Structured Query Language) (sql)

Următoarea interogare găsește numărul de produse vândute de segment. Aceasta definește un set de grupare (segment):

Code language: SQL (Structured Query Language) (sql)

Următoarea interogare găsește numărul de produse vândute pentru toate mărcile și segmentele. Aceasta definește un set de grupare gol care este notat cu ().

Code language: SQL (Structured Query Language) (sql)

Să presupunem că doriți să găsiți toate seturile de grupare utilizând o singură interogare. Pentru a realiza acest lucru, puteți utiliza UNION ALL pentru a combina toate interogările de mai sus.

Pentru că UNION ALL cere ca toate seturile de rezultate să aibă același număr de coloane cu tipuri de date compatibile, trebuie să ajustați interogările adăugând NULL la lista de selecție a fiecăreia, așa cum se arată mai jos:

Code language: SQL (Structured Query Language) (sql)

Această interogare a generat un singur set de rezultate cu agregatele pentru toate seturile de grupare.

Chiar dacă interogarea de mai sus funcționează așa cum vă așteptați, ea are două probleme principale.

  • În primul rând, este destul de lungă.
  • În al doilea rând, are o problemă de performanță deoarece PostgreSQL trebuie să scaneze tabelul sales separat pentru fiecare interogare.

Pentru a o face mai eficientă, PostgreSQL oferă clauza GROUPING SETS, care este subclauza clauzei GROUP BY.

Clauza GROUPING SETS vă permite să definiți mai multe seturi de grupare în aceeași interogare.

Sintaxa generală a clauzei GROUPING SETS este următoarea:

Code language: SQL (Structured Query Language) (sql)

În această sintaxă, avem patru seturi de grupare (c1,c2), (c1), (c2) și ().

Pentru a aplica această sintaxă la exemplul de mai sus, puteți utiliza clauza GROUPING SETS în locul clauzei UNION ALL astfel:

Code language: SQL (Structured Query Language) (sql)

Această interogare este mult mai scurtă și mai ușor de citit. În plus, PostgreSQL va optimiza numărul de ori în care scanează tabelul sales și nu va scana de mai multe ori.

Funcția de grupare

Funcția GROUPING() acceptă un argument care poate fi un nume de coloană sau o expresie:

Funcția column_name sau expression trebuie să se potrivească cu cea specificată în clauza GROUP BY.

Funcția GROUPING() returnează bitul 0 dacă argumentul este un membru al setului de grupare curent și 1 în caz contrar.

Vezi următorul exemplu:

Code language: SQL (Structured Query Language) (sql)

Cum se arată în captura de ecran, atunci când valoarea din grouping_brand este 0, coloana sum arată subtotalul din brand.

Când valoarea din grouping_segment este zero, coloana sumă arată subtotalul din segment.

Puteți utiliza funcția GROUPING() din clauza HAVING pentru a găsi subtotalul fiecărei mărci, astfel:

În acest tutorial, ați învățat cum să utilizați funcția GROUPING SETS PostgreSQL GROUPING SETS pentru a genera mai multe seturi de grupare.

  • A fost util acest tutorial?
  • DaNu

.

Similar Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată.