SQL Server GROUPING SETS
Sammanfattning: I den här handledningen lär du dig hur du använder SQL Server GROUPING SETS
för att generera flera grupperingsuppsättningar.
Sätt upp en tabell med försäljningsöversikter
Låt oss skapa en ny tabell med namnet sales.sales_summary
för demonstrationen.
Code language: SQL (Structured Query Language) (sql)
I den här frågan hämtar vi data om försäljningsbelopp per varumärke och kategori och fyller den i tabellen sales.sales_summary
.
Följande fråga returnerar data från tabellen sales.sales_summary
:
Code language: SQL (Structured Query Language) (sql)
Kom igång med SQL Server GRUPPERINGSUPPERSONER
En grupperingsuppsättning är definitionsmässigt en grupp av kolumner genom vilka du grupperar. Vanligtvis definierar en enda fråga med ett aggregat en enda grupperingsuppsättning.
För att ta ett exempel definierar följande fråga en grupperingsuppsättning som inkluderar varumärke och kategori, vilket betecknas som (brand, category)
. Frågan returnerar försäljningsbeloppet grupperat efter varumärke och kategori:
Code language: SQL (Structured Query Language) (sql)
Följande fråga returnerar försäljningsbeloppet efter varumärke. Den definierar en grupperingsuppsättning (brand)
:
Code language: SQL (Structured Query Language) (sql)
Följande fråga returnerar försäljningsbeloppet per kategori. Den definierar en grupperingsuppsättning (category)
:
Code language: SQL (Structured Query Language) (sql)
Följande fråga definierar en tom grupperingsuppsättning ()
. Den returnerar försäljningsbeloppet för alla varumärken och kategorier.
Code language: SQL (Structured Query Language) (sql)
De fyra frågorna ovan returnerar fyra resultatuppsättningar med fyra grupperingsuppsättningar:
Code language: SQL (Structured Query Language) (sql)
För att få en enhetlig resultatuppsättning med aggregerade data för alla grupperingsuppsättningar kan du använda operatorn UNION ALL
.
Om att UNION ALL
-operatorn kräver att alla resultatuppsättningar har samma antal kolumner måste du lägga till NULL
i urvalslistan till frågorna så här:
Code language: SQL (Structured Query Language) (sql)
Frågan genererade ett enda resultat med de aggregerade uppgifterna för alla grupperingsuppsättningar som vi förväntade oss.
Den har dock två stora problem:
- Frågan är ganska lång.
- Frågan är långsam eftersom SQL Server måste utföra fyra underfrågor och kombinerar resultatuppsättningarna till en enda.
För att åtgärda dessa problem tillhandahåller SQL Server en underklausul till GROUP BY
-klausulen som heter GROUPING SETS
.
I GROUPING SETS
definieras flera grupperingsuppsättningar i samma fråga. Följande visar den allmänna syntaxen för GROUPING SETS
:
Code language: SQL (Structured Query Language) (sql)
Denna fråga skapar fyra grupperingsuppsättningar:
Code language: SQL (Structured Query Language) (sql)
Du kan använda den här GROUPING SETS
för att skriva om frågan som hämtar försäljningsdata på följande sätt:
Code language: SQL (Structured Query Language) (sql)
Som du kan se ger frågan samma resultat som den som använder operatorn UNION ALL
. Den här frågan är dock mycket mer lättläst och naturligtvis effektivare.
GROUPING-funktion
Funktionen GROUPING
anger om en angiven kolumn i en GROUP BY
-klausul aggregeras eller inte. Den returnerar 1 för aggregerad eller 0 för ej aggregerad i resultatuppsättningen.
Se följande frågeexempel:
Code language: SQL (Structured Query Language) (sql)
Värdet i grouping_brand
-kolumnen indikerar att raden är aggregerad eller inte, 1 betyder att försäljningsbeloppet är aggregerat per varumärke, 0 betyder att försäljningsbeloppet inte är aggregerat per varumärke. Samma koncept tillämpas på kolumnen grouping_category
.
I den här handledningen har du lärt dig hur man genererar flera grupperingsuppsättningar i en fråga med hjälp av SQL Server GROUPING SETS
.
.