Sammanfattning: I den här handledningen kommer du att lära dig om begreppet grupperingsuppsättning och hur du använder PostgreSQL GROUPING SETS
-klausulen för att generera flera grupperingsuppsättningar i en fråga.
Inställ en exempeltabell
Låt oss börja med att skapa en ny tabell kalladsales
för demonstrationen.
Code language: SQL (Structured Query Language) (sql)
Tabellen sales
lagrar antalet sålda produkter per varumärke och segment.
Introduktion till PostgreSQL GROUPING SETS
En grupperingsuppsättning är en uppsättning kolumner som du grupperar med hjälp av GROUP BY
-klausulen.
En grupperingsuppsättning betecknas av en kommaseparerad lista med kolumner som placeras inom parenteser:
För att ta ett exempel använder följande fråga GROUP BY
-klausulen för att returnera antalet sålda produkter per varumärke och segment. Med andra ord definieras en grupperingsuppsättning för varumärke och segment som betecknas med (brand, segement)
Code language: SQL (Structured Query Language) (sql)
Följande sökfråga hittar antalet produkter som säljs av ett varumärke. Den definierar en grupperingsuppsättning (brand)
:
Code language: SQL (Structured Query Language) (sql)
Med följande fråga kan man få reda på antalet sålda produkter per segment. Den definierar en grupperingsuppsättning (segment)
:
Code language: SQL (Structured Query Language) (sql)
Med följande fråga får du fram antalet sålda produkter för alla varumärken och segment. Den definierar en tom grupperingsmängd som betecknas med ()
.
Code language: SQL (Structured Query Language) (sql)
Antag att du vill söka alla grupperingsmängder med hjälp av en enda fråga. För att uppnå detta kan du använda UNION ALL
för att kombinera alla ovanstående frågor.
Om UNION ALL
kräver att alla resultatuppsättningar har samma antal kolumner med kompatibla datatyper, måste du justera frågorna genom att lägga till NULL
i urvalslistan för var och en av dem, vilket visas nedan:
Code language: SQL (Structured Query Language) (sql)
Denna fråga genererade en enda resultatuppsättning med aggregaten för alla grupperingsuppsättningar.
Även om ovanstående fråga fungerar som förväntat har den två huvudproblem.
- För det första är den ganska lång.
- För det andra har den ett prestandaproblem eftersom PostgreSQL måste skanna
sales
-tabellen separat för varje fråga.
För att göra det effektivare tillhandahåller PostgreSQL GROUPING SETS
-klausulen som är en underklausul till GROUP BY
-klausulen.
Med GROUPING SETS
kan du definiera flera grupperingsuppsättningar i samma fråga.
Den allmänna syntaxen för GROUPING SETS
är följande:
Code language: SQL (Structured Query Language) (sql)
I denna syntax har vi fyra grupperingsuppsättningar (c1,c2)
, (c1)
, (c2)
och ()
.
För att tillämpa den här syntaxen på exemplet ovan kan du använda GROUPING SETS
-klausulen i stället för UNION ALL
-klausulen på följande sätt:
Code language: SQL (Structured Query Language) (sql)
Denna fråga är mycket kortare och mer lättläst. Dessutom optimerar PostgreSQL antalet gånger som tabellen sales
genomsöks och genomsöker inte tabellen sales
flera gånger.
Grupperingsfunktion
Funktionen GROUPING()
tar emot ett argument som kan vara ett kolumnnamn eller ett uttryck:
Den column_name
eller expression
måste stämma överens med den som anges i GROUP BY
-klausulen.
Funktionen GROUPING()
returnerar bit 0 om argumentet ingår i den aktuella grupperingsuppsättningen och 1 annars.
Se följande exempel:
Code language: SQL (Structured Query Language) (sql)
Som visas i skärmdumpen, när värdet i grouping_brand
är 0, visar kolumnen sum
delsumman av brand
.
När värdet i grouping_segment
är noll, visar kolumnen summa delsumman av segment
.
Du kan använda GROUPING()
-funktionen i HAVING
-klausulen för att hitta delsumman för varje varumärke så här:
I den här handledningen har du lärt dig hur du använder PostgreSQL GROUPING SETS
för att generera flera grupperingsuppsättningar.
- Var den här handledningen till hjälp?
- JaNej