PostgreSQL GROUPING SETS

author
3 minutes, 22 seconds Read

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

Similar Posts

Lämna ett svar

Din e-postadress kommer inte publiceras.