PostgreSQL GROUPING SETS

author
3 minutes, 4 seconds Read

Summary: I denne tutorial vil du lære om grupperingssæt-konceptet og hvordan du bruger PostgreSQL GROUPING SETS-klausulen til at generere flere grupperingssæt i en forespørgsel.

Oprettelse af en eksempeltabel

Lad os komme i gang med at oprette en ny tabel kaldetsales til demonstrationen.

Code language: SQL (Structured Query Language) (sql)

Tabellen sales gemmer antallet af solgte produkter efter mærke og segment.

Indledning til PostgreSQL GROUPING SETS

Et grupperingssæt er et sæt kolonner, som du grupperer ved hjælp af GROUP BY-klausulen.

Et grupperingssæt betegnes ved en kommasepareret liste af kolonner, der er placeret inden for parenteser:

Den følgende forespørgsel bruger f.eks. GROUP BY-klausulen til at returnere antallet af solgte produkter efter mærke og segment. Den definerer med andre ord et grupperingssæt af mærke og segment, som er angivet ved (brand, segement)

Code language: SQL (Structured Query Language) (sql)

Den følgende forespørgsel finder antallet af produkter, der er solgt af et mærke. Den definerer et grupperingssæt (brand):

Code language: SQL (Structured Query Language) (sql)

Den følgende forespørgsel finder antallet af solgte produkter pr. segment. Den definerer et grupperingssæt (segment):

Code language: SQL (Structured Query Language) (sql)

Den følgende forespørgsel finder antallet af solgte produkter for alle mærker og segmenter. Den definerer et tomt grupperingssæt, som er angivet ved ().

Code language: SQL (Structured Query Language) (sql)

Sæt, at du ønsker at alle grupperingssæt ved hjælp af en enkelt forespørgsel. For at opnå dette kan du bruge UNION ALL til at kombinere alle ovenstående forespørgsler.

Da UNION ALL kræver, at alle resultatsæt skal have det samme antal kolonner med kompatible datatyper, skal du justere forespørgslerne ved at tilføje NULL til valglisten for hver som vist nedenfor:

Code language: SQL (Structured Query Language) (sql)

Denne forespørgsel genererede et enkelt resultatsæt med aggregaterne for alle grupperingssæt.

Selv om ovenstående forespørgsel fungerer som forventet, har den to hovedproblemer.

  • For det første er den ret langvarig.
  • For det andet har den et præstationsproblem, fordi PostgreSQL skal scanne sales-tabellen separat for hver forespørgsel.

For at gøre det mere effektivt tilbyder PostgreSQL GROUPING SETS-klausulen, som er en underklausul til GROUP BY-klausulen.

Med GROUPING SETS kan du definere flere grupperingssæt i den samme forespørgsel.

Den generelle syntaks for GROUPING SETS er som følger:

Code language: SQL (Structured Query Language) (sql)

I denne syntaks har vi fire grupperingssæt (c1,c2), (c1), (c2) og ().

For at anvende denne syntaks på ovenstående eksempel kan du bruge GROUPING SETS-klausulen i stedet for UNION ALL-klausulen på følgende måde:

Denne forespørgsel er meget kortere og mere læsevenlig. Desuden optimerer PostgreSQL antallet af gange, den scanner sales-tabellen, og den scanner ikke flere gange.

Grupperingsfunktion

Funktionen GROUPING() accepterer et argument, som kan være et kolonnenavn eller et udtryk:

Den column_name eller expression skal stemme overens med den, der er angivet i GROUP BY-klausulen.

Funktionen GROUPING() returnerer bit 0, hvis argumentet er et medlem af det aktuelle grupperingssæt, og 1 i modsat fald.

Se følgende eksempel:

Code language: SQL (Structured Query Language) (sql)

Som vist i skærmbilledet viser kolonnen sum subtotalen for brand, når værdien i grouping_brand er 0.

Når værdien i grouping_segment er 0, viser sumkolonnen subtotalen for segment.

Du kan bruge GROUPING()-funktionen i HAVING-klausulen til at finde subtotalen for hvert mærke på denne måde:

I denne vejledning har du lært, hvordan du bruger PostgreSQL GROUPING SETS til at generere flere grupperingssæt.

  • Var denne vejledning nyttig?
  • JaNej

Similar Posts

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.