SUPINOVÉ SESTAVY SQL Serveru
Shrnutí: v tomto kurzu se naučíte, jak pomocí SQL Serveru GROUPING SETS
vytvořit více skupinových sad.
Nastavení souhrnné tabulky prodeje
Pro ukázku vytvoříme novou tabulku s názvem sales.sales_summary
.
Code language: SQL (Structured Query Language) (sql)
V tomto dotazu získáme údaje o výši prodeje podle značky a kategorie a naplníme je do tabulky sales.sales_summary
.
Následující dotaz vrátí data z tabulky sales.sales_summary
:
Code language: SQL (Structured Query Language) (sql)
Začínáme se skupinovacími sadami SQL Serveru
Podle definice je skupinovací sada skupina sloupců, podle kterých se seskupuje. Obvykle jeden dotaz s agregací definuje jednu seskupovací sadu.
Například následující dotaz definuje seskupovací sadu, která zahrnuje značku a kategorii, která je označena jako (brand, category)
. Dotaz vrátí částku prodeje seskupenou podle značky a kategorie:
Code language: SQL (Structured Query Language) (sql)
Následující dotaz vrátí částku prodeje podle značky. Definuje seskupovací množinu (brand)
:
Code language: SQL (Structured Query Language) (sql)
Následující dotaz vrací částku prodeje podle kategorie. Definuje seskupovací množinu (category)
:
Code language: SQL (Structured Query Language) (sql)
Následující dotaz definuje prázdnou seskupovací množinu ()
. Vrací výši prodeje pro všechny značky a kategorie:
Code language: SQL (Structured Query Language) (sql)
Čtyři výše uvedené dotazy vracejí čtyři množiny výsledků se čtyřmi seskupovacími množinami:
Code language: SQL (Structured Query Language) (sql)
Chcete-li získat jednotnou množinu výsledků s agregovanými daty pro všechny seskupovací množiny, můžete použít operátor UNION ALL
.
Protože operátor UNION ALL
vyžaduje, aby všechny výsledkové sady měly stejný počet sloupců, musíte do seznamu select k dotazům přidat NULL
takto:
Code language: SQL (Structured Query Language) (sql)
Dotaz vygeneroval jednotný výsledek s agregovanými údaji pro všechny seskupovací sady, jak jsme očekávali.
Má však dva zásadní problémy:
- Dotaz je poměrně dlouhý.
- Dotaz je pomalý, protože SQL Server musí provést čtyři poddotazy a spojí výsledné množiny do jedné.
Pro odstranění těchto problémů poskytuje SQL Server podvětu klauzule GROUP BY
nazvanou GROUPING SETS
.
Klauzule GROUPING SETS
definuje více seskupovacích sad v jednom dotazu. Následující příklad ukazuje obecnou syntaxi GROUPING SETS
:
Code language: SQL (Structured Query Language) (sql)
Tento dotaz vytvoří čtyři seskupovací množiny:
Code language: SQL (Structured Query Language) (sql)
Tento GROUPING SETS
můžete použít k přepsání dotazu, který získá údaje o prodeji, takto:
Code language: SQL (Structured Query Language) (sql)
Jak vidíte, dotaz dává stejný výsledek jako dotaz, který používá operátor UNION ALL
. Tento dotaz je však mnohem čitelnější a samozřejmě efektivnější.
Funkce GROUPING
Funkce GROUPING
udává, zda je zadaný sloupec v klauzuli GROUP BY
agregován, nebo ne. Vrací 1 pro agregované nebo 0 pro neagregované v souboru výsledků.
Podívejte se na následující příklad dotazu:
Code language: SQL (Structured Query Language) (sql)
Hodnota ve sloupci grouping_brand
udává, zda je řádek agregovaný nebo ne, 1 znamená, že částka prodeje je agregovaná podle značky, 0 znamená, že částka prodeje není agregovaná podle značky. Stejný koncept je aplikován na sloupec grouping_category
.
V tomto tutoriálu jste se naučili, jak v dotazu vytvořit více seskupovacích sad pomocí SQL Serveru GROUPING SETS
.
.