Souhrn: V tomto kurzu se seznámíte s konceptem skupinových sad a s tím, jak pomocí klauzule PostgreSQL GROUPING SETS
vytvořit v dotazu více skupinových sad.
Nastavení ukázkové tabulky
Začneme tím, že pro ukázku vytvoříme novou tabulku s názvemsales
.
Code language: SQL (Structured Query Language) (sql)
Tabulka sales
uchovává počet prodaných výrobků podle značky a segmentu.
Úvod do PostgreSQL SKUPINOVÉ SADY
Skupinová sada je množina sloupců, podle kterých se seskupuje pomocí klauzule GROUP BY
.
Skupinová sada je označena čárkou odděleným seznamem sloupců umístěným v závorkách:
Například následující dotaz používá klauzuli GROUP BY
pro vrácení počtu prodaných výrobků podle značky a segmentu. Jinými slovy definuje seskupovací množinu značky a segmentu, která je označena (brand, segement)
Code language: SQL (Structured Query Language) (sql)
Následující dotaz zjistí počet výrobků prodaných podle značky. Definuje seskupovací množinu (brand)
:
Code language: SQL (Structured Query Language) (sql)
Následující dotaz zjistí počet prodaných výrobků podle segmentu. Definuje seskupovací množinu (segment)
:
Code language: SQL (Structured Query Language) (sql)
Následující dotaz zjistí počet prodaných výrobků pro všechny značky a segmenty. Definuje prázdnou seskupovací množinu, která je označena ()
.
Code language: SQL (Structured Query Language) (sql)
Předpokládejte, že chcete všechny seskupovací množiny pomocí jediného dotazu. Abyste toho dosáhli, můžete použít UNION ALL
ke spojení všech výše uvedených dotazů.
Protože UNION ALL
vyžaduje, aby všechny výsledkové množiny měly stejný počet sloupců s kompatibilními datovými typy, musíte dotazy upravit přidáním NULL
do výběrového seznamu každého z nich, jak je uvedeno níže:
Code language: SQL (Structured Query Language) (sql)
Tento dotaz vygeneroval jedinou výsledkovou množinu s agregáty pro všechny seskupovací množiny.
Přestože výše uvedený dotaz funguje podle očekávání, má dva hlavní problémy:
- Poprvé je poměrně dlouhý
- Druhé má problém s výkonem, protože PostgreSQL musí pro každý dotaz prohledávat tabulku
sales
zvlášť.
Pro zefektivnění poskytuje PostgreSQL klauzuli GROUPING SETS
, která je podkapitolou klauzule GROUP BY
.
Klauzule GROUPING SETS
umožňuje definovat více seskupovacích sad v jednom dotazu.
Obecná syntaxe klauzule GROUPING SETS
je následující:
Code language: SQL (Structured Query Language) (sql)
V této syntaxi máme čtyři seskupovací množiny (c1,c2)
, (c1)
, (c2)
a ()
.
Pro použití této syntaxe ve výše uvedeném příkladu můžete místo klauzule UNION ALL
použít klauzuli GROUPING SETS
takto:
Code language: SQL (Structured Query Language) (sql)
Tento dotaz je mnohem kratší a čitelnější. Navíc PostgreSQL optimalizuje počet skenování tabulky sales
a nebude ji skenovat vícekrát.
Funkce seskupení
Funkce GROUPING()
přijímá argument, kterým může být název sloupce nebo výraz:
Funkce column_name
nebo expression
se musí shodovat s tou, která je uvedena v klauzuli GROUP BY
.
Funkce GROUPING()
vrací bit 0, pokud je argument členem aktuální množiny seskupení, a 1 v opačném případě.
Podívejte se na následující příklad:
Code language: SQL (Structured Query Language) (sql)
Jak ukazuje obrázek, když je hodnota v grouping_brand
0, sloupec sum
ukazuje mezisoučet brand
.
Když je hodnota v grouping_segment
nula, sloupec součet ukazuje mezisoučet segment
.
Pro zjištění mezisoučtu jednotlivých značek můžete použít funkci GROUPING()
v klauzuli HAVING
takto:
V tomto návodu jste se naučili používat funkci PostgreSQL GROUPING SETS
k vytvoření více seskupovacích sad.
- Byl tento návod užitečný?
- AnoNe
.