Operatørerne ROLLUP og CUBE bruges til at returnere resultater aggregeret af kolonnerne i GROUP BY-sætningen.
GROUPING- og GROUPING_ID-funktionerne bruges til at identificere, om kolonnerne i GROUP BY-listen er aggregerede (ved hjælp af ROLLUP- eller CUBE-operatorerne) eller ej.
Der er to væsentlige forskelle mellem funktionerne GROUPING og GROUPING_ID.
De er som følger:
- GRUPPERINGSfunktionen kan anvendes på en enkelt kolonne, hvorimod kolonnelisten for GROUPING_ID-funktionen skal matche kolonnelisten i GROUP BY-sætningen.
- GRUPPERING-funktionen angiver, om en kolonne i GROUP BY-listen er aggregeret eller ej. Det returnerer 1, hvis resultatsættet er aggregeret, og 0, hvis resultatsættet ikke er aggregeret.
På den anden side returnerer GROUPING_ID-funktionen også et heltal. Den udfører dog den binære til decimalkonvertering efter sammenkædning af resultatet af alle GRUPPERINGSfunktionerne.
I denne artikel vil vi se funktionerne GROUPING og GROUPING_ID i aktion ved hjælp af eksempler.
Forberedelse af nogle dummy-data
Lad os som altid oprette nogle dummy-data, som vi skal bruge til det eksempel, som vi vil arbejde med i denne artikel.
Udfør følgende script:
CREATE Database company; USE company; CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, salary INT NOT NULL, department VARCHAR(50) NOT NULL ) INSERT INTO employee VALUES (1, 'David', 'Male', 5000, 'Sales'), (2, 'Jim', 'Female', 6000, 'HR'), (3, 'Kate', 'Female', 7500, 'IT'), (4, 'Will', 'Male', 6500, 'Marketing'), (5, 'Shane', 'Female', 5500, 'Finance'), (6, 'Shed', 'Male', 8000, 'Sales'), (7, 'Vik', 'Male', 7200, 'HR'), (8, 'Vince', 'Female', 6600, 'IT'), (9, 'Jane', 'Female', 5400, 'Marketing'), (10, 'Laura', 'Female', 6300, 'Finance'), (11, 'Mac', 'Male', 5700, 'Sales'), (12, 'Pat', 'Male', 7000, 'HR'), (13, 'Julie', 'Female', 7100, 'IT'), (14, 'Elice', 'Female', 6800,'Marketing'), (15, 'Wayne', 'Male', 5000, 'Finance')
I scriptet ovenfor har vi oprettet en database med navnet "Virksomhed". Vi har derefter oprettet en tabel "Medarbejder" i firmadatabasen. Endelig har vi indsat nogle dummy-poster i medarbejdertabellen.
GRUPPERING
Som nævnt ovenfor returnerer funktionen GRUPPERING 1, hvis resultatsættet er aggregeret, og 0, hvis resultatsættet ikke er aggregeret.
Tag et kig på følgende script for at se GRUPPERINGS-funktionen i aktion.
SELECT department AS Department, gender AS Gender, sum(salary) as Salary_Sum, GROUPING(department) as GP_Department, GROUPING(gender) as GP_Gender FROM employee GROUP BY ROLLUP (department, gender)
Scriptet ovenfor tæller summen af lønningerne for alle de mandlige og kvindelige medarbejdere, som først er grupperet efter afdelingskolonnen og derefter efter kolonnen Køn. Yderligere to kolonner tilføjes for at vise resultatet af GRUPPERINGS-funktionen, der er anvendt på afdelingen og kønskolonnerne.
ROLLUP-operatoren bruges til at vise summen af lønninger i form af totaltotaler og subtotaler.
Outputtet af scriptet ovenfor ser sådan ud.
Tag et omhyggeligt kig på outputtet. Summen af lønninger vises efter køn efter afdelingskøn (række 1, 2, 4, 5, 7, 9, 10 og 12). Det aggregeres også kun efter køn (række 3, 6, 8, 11 og 13). Endelig vises den samlede samlede løn aggregeret af både afdeling og køn i række 14.
1 vises i GRUPPERINGS-funktionskolonnen GP_Køn for rækker, hvor resultaterne er aggregeret efter køn, dvs. række 3, 6, 8, 11 og 13. Dette skyldes, at kolonnen GP_Køn indeholder resultatet af GRUPPERINGS-funktionen, der er anvendt på kolonnen Køn.
På samme måde indeholder række 14 den aggregerede sum af alle afdelinger og alle kolonner. Derfor returneres 1 for både GP_Department og GP_Gender kolonnerne.
Du kan se NULL vises i kolonnerne Afdeling og Køn i outputtet, hvor resultaterne er aggregeret. For eksempel i række 3 vises NULL i kolonnen Køn, fordi resultaterne er aggregeret efter kønskolonne, og der er derfor ingen kolonneværdi at vise. Vi ønsker ikke, at vores brugere skal se NULL, et bedre ord her kunne være "Alle køn".
For at gøre dette skal vi ændre vores script som følger:
SELECT CASE WHEN GROUPING(department) = 1 THEN 'All Departments' ELSE ISNULL(department, 'Unknown') END as Department, CASE WHEN GROUPING(gender) = 1 THEN 'All Genders' ELSE ISNULL(gender, 'Unknown') END as Gender, sum(salary) as Salary_Sum FROM employee GROUP BY ROLLUP (department, gender)
I scriptet ovenfor, hvis GRUPPERINGSfunktionen anvendt på afdelingskolonnen returnerer 1 og "Alle afdelinger" vises i afdelingskolonnen. Ellers, hvis afdelingskolonnen indeholder værdien NULL, vil den vise "Ukendt". Kønskolonnen er blevet ændret på samme måde.
Kørsel af scriptet ovenfor giver følgende resultater:
Du kan se, at NULL i kolonnerne Afdeling og Køn, hvor GRUPPERINGSfunktionen returnerer 1, er blevet erstattet med henholdsvis "Alle afdelinger" og "Alle køn".
GROUPING_ID-funktion
GROUPING_ID-funktionen sammenkæder outputtet af GROUPING-funktionerne anvendt på alle de kolonner, der er specificeret i GROUP BY-sætningen. Den udfører derefter binær til decimal konvertering, før den returnerer det endelige output.
Lad os først sammenkæde outputtet, der returneres af funktionen GRUPPERING, der anvendes til kolonnerne Afdeling og Køn. Tag et kig på følgende script:
USE company SELECT department AS Department, gender AS Gender, sum(salary) as Salary_Sum, CAST(GROUPING(department) AS VARCHAR(1)) + CAST(GROUPING(gender) AS VARCHAR (1)) as Grouping FROM employee GROUP BY ROLLUP (department, gender)
I outputtet vil du se 0'er og 1'ere returneret af funktionen GRUPPERING sammenkædet. Outputtet ser således ud:
GROUPING_ID-funktionen returnerer simpelthen decimalækvivalenten af den binære værdi dannet som et resultat af sammenkædningen af værdierne returneret af GROUPING-funktionerne.
Udfør følgende script for at se funktionen GRUPPERINGS-ID i aktion:
USE company SELECT department AS Department, gender AS Gender, sum(salary) as Salary_Sum, CAST(GROUPING(department) AS VARCHAR(1)) + CAST(GROUPING(gender) AS VARCHAR (1)) as Grouping, GROUPING_ID(department, gender) as Grouping_Id FROM employee GROUP BY ROLLUP (department, gender)
For række 1 vil GRUPPERINGS-ID-funktionen returnere 0, da decimalækvivalenten til '00' er nul.
For række 3, 6, 8, 11 og 13 returnerer funktionen GROUPING_ID 1, da decimalækvivalenten til '01' er 1.
Til sidst, for række 14, returnerer GROUPIND_ID-funktionen 3, da den binære ækvivalent af '11' er 3.
Outputtet af scriptet ovenfor ser sådan ud:
Se også:
Microsoft:Grouping_ID Oversigt
Microsoft:Grupperingsoversigt
YouTube:Grouping &Grouping_ID