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
.