Met de volgende query wordt het verkoopbedrag per categorie teruggegeven. Hiermee wordt een groepset gedefinieerd (category)
:
De volgende query definieert een lege groepset ()
. Hiermee wordt het verkoopbedrag voor alle merken en categorieën weergegeven.
Code language: SQL (Structured Query Language) (sql)
De vier bovenstaande query’s leveren vier resultaatreeksen op met vier groeperingsreeksen:
Code language: SQL (Structured Query Language) (sql)
Om een gecombineerde resultaatreeks te krijgen met de geaggregeerde gegevens voor alle groeperingsreeksen, kunt u de operator UNION ALL
gebruiken.
Omdat UNION ALL
operator vereist dat alle resultaten set hetzelfde aantal kolommen hebben, moet u NULL
toevoegen aan de select lijst aan de query’s als volgt:
Code language: SQL (Structured Query Language) (sql)
De query genereerde een enkel resultaat met de aggregaten voor alle groepering sets zoals we verwachtten.
De query heeft echter twee grote problemen:
De query is vrij lang.
De query is traag omdat SQL Server vier subquery’s moet uitvoeren en de resultatensets tot een enkele moet combineren.
Om deze problemen op te lossen, biedt SQL Server een subclausule van de GROUP BY
-clausule genaamd GROUPING SETS
.
De GROUPING SETS
definieert meerdere groeperingssets in dezelfde query. Het volgende toont de algemene syntaxis van de GROUPING SETS
:
Code language: SQL (Structured Query Language) (sql)
Deze query creëert vier groeperingsreeksen:
Code language: SQL (Structured Query Language) (sql)
U kunt deze GROUPING SETS
gebruiken om de query die de verkoopgegevens krijgt als volgt te herschrijven:
Code language: SQL (Structured Query Language) (sql)
Zoals u kunt zien, levert de query hetzelfde resultaat op als de query die de UNION ALL
operator gebruikt. Deze query is echter veel leesbaarder en natuurlijk efficiënter.
GROUPING-functie
De GROUPING
-functie geeft aan of een opgegeven kolom in een GROUP BY
-clausule is geaggregeerd of niet. De functie geeft 1 weer voor geaggregeerd of 0 voor niet geaggregeerd in de resultaatverzameling.
Zie het volgende queryvoorbeeld:
Code language: SQL (Structured Query Language) (sql)
De waarde in de kolom grouping_brand
geeft aan of de rij is geaggregeerd of niet, 1 betekent dat het verkoopbedrag per merk is geaggregeerd, 0 betekent dat het verkoopbedrag niet per merk is geaggregeerd. Hetzelfde concept wordt toegepast op de grouping_category
-kolom.
In deze tutorial hebt u geleerd hoe u meerdere groeperingsreeksen in een query kunt genereren met behulp van de SQL Server GROUPING SETS
.