sql >> Database teknologi >  >> RDS >> Sqlserver

Forstå GROUPING og GROUPING_ID funktioner i SQL Server

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


  1. Forbind din OEM til Grafana ved hjælp af Enterprise Manager-appen til Grafana

  2. Oracle Indsæt Vælg med bestil efter

  3. Hvordan opretter jeg en lagret procedure, der valgfrit vil søge i kolonner?

  4. Vender tilbage fra en funktion med OUT parameter