sql >> Databasteknik >  >> RDS >> Sqlserver

Förstå GROUPING och GROUPING_ID funktioner i SQL Server

Operatörerna ROLLUP och CUBE används för att returnera resultat aggregerade av kolumnerna i GROUP BY-satsen.

Funktionerna GROUPING och GROUPING_ID används för att identifiera om kolumnerna i GROUP BY-listan är aggregerade (med operatorerna ROLLUP eller CUBE) eller inte.

Det finns två stora skillnader mellan funktionerna GROUPING och GROUPING_ID.

De är följande:

  • GRUPPERING-funktionen är tillämplig på en enda kolumn, medan kolumnlistan för funktionen GROUPING_ID måste matcha kolumnlistan i GROUP BY-satsen.
  • GRUPPERING-funktionen indikerar om en kolumn i listan GROUP BY är aggregerad eller inte. Den returnerar 1 om resultatuppsättningen är aggregerad och 0 om resultatuppsättningen inte är aggregerad.

Å andra sidan returnerar GROUPING_ID-funktionen också ett heltal. Däremot utför den binär till decimalomvandling efter sammanlänkning av resultatet av alla GRUPPERINGSfunktioner.

I den här artikeln kommer vi att se funktionerna GROUPING och GROUPING_ID i aktion med hjälp av exempel.

Förbereder lite dummydata

Som alltid, låt oss skapa lite dummydata som vi ska använda för exemplet som vi kommer att arbeta med i den här artikeln.

Kör följande skript:

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 skriptet ovan har vi skapat en databas med namnet "Företag". Vi har sedan skapat en tabell "Anställd" i Företagsdatabasen. Slutligen har vi infogat några dummy-poster i tabellen Employee.

GRUPPERING

Som nämnts ovan returnerar funktionen GRUPPERNING 1 om resultatuppsättningen är aggregerad och 0 om resultatuppsättningen inte är aggregerad.

Ta en titt på följande skript för att se GRUPPERING-funktionen i funktion.

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)

Skriptet ovan räknar summan av lönerna för alla manliga och kvinnliga anställda, som först grupperas efter Avdelningskolumnen och sedan efter Kolumnen Kön. Ytterligare två kolumner läggs till för att visa resultatet av funktionen GRUPPERNING som tillämpas på avdelningen och kolumnerna Genus.

ROLLUP-operatorn används för att visa summan av löner i form av totalsummor och delsummor.

Utdata från skriptet ovan ser ut så här.

Ta en noggrann titt på utgången. Summan av löner visas efter kön efter avdelningskön (rad 1, 2, 4, 5, 7, 9, 10 och 12). Det är då också aggregerat endast efter kön (rad 3, 6, 8, 11 och 13). Slutligen visas totalsumman för löner aggregerade av både avdelning och kön på rad 14.

1 visas i funktionskolumnen GP_Kön för GRUPPERING för rader där resultaten är aggregerade efter kön, dvs raderna 3, 6, 8, 11 och 13. Detta beror på att kolumnen GP_Kön innehåller resultatet av funktionen GRUPPERNING som tillämpas på kolumnen Kön.

På samma sätt innehåller rad 14 den aggregerade summan av alla avdelningar och alla kolumner. Därför returneras 1 för både kolumnerna GP_Department och GP_Gender.

Du kan se att NULL visas i kolumnerna Avdelning och Kön i utgången där resultaten är aggregerade. Till exempel på rad 3 visas NULL i kolumnen Gender eftersom resultaten är aggregerade efter könskolumn och därför finns det inget kolumnvärde att visa. Vi vill inte att våra användare ska se NULL, ett bättre ord här kan vara "Alla kön".

För att göra detta måste vi ändra vårt skript enligt följande:

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 skriptet ovan, om funktionen GRUPPERNING tillämpad på kolumnen Avdelning returnerar 1 och "Alla avdelningar" visas i kolumnen Avdelning. Annars, om avdelningskolumnen innehåller värdet NULL, kommer den att visa "Okänd". Kolumnen genus har ändrats på samma sätt.

Att köra skriptet ovan ger följande resultat:

Du kan se att NULL i kolumnerna Avdelning och Kön där funktionen GRUPPERING returnerar 1 har ersatts med "Alla avdelningar" respektive "Alla kön".

GROUPING_ID-funktion

GROUPING_ID-funktionen sammanfogar utdata från GROUPING-funktionerna som tillämpas på alla kolumner som anges i GROUP BY-satsen. Den utför sedan binär till decimalkonvertering innan den returnerar den slutliga utdata.

Låt oss först sammanfoga utdata som returneras av funktionen GRUPPERNING som tillämpas på kolumnerna Avdelning och Kön. Ta en titt på följande skript:

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 utgången kommer du att se 0:or och 1:or som returneras av funktionen GRUPPERNING sammanlänkade. Utdatan ser ut så här:

GROUPING_ID-funktionen returnerar helt enkelt decimalekvivalenten till det binära värdet som bildas som ett resultat av sammanlänkningen av värdena som returneras av GROUPING-funktionerna.

Kör följande skript för att se funktionen GRUPPERINGSID 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)

För rad 1 kommer funktionen GRUPPERINGSID att returnera 0 eftersom decimalmotsvarigheten till '00' är noll.

För raderna 3, 6, 8, 11 och 13 returnerar GROUPING_ID-funktionen 1 eftersom decimalmotsvarigheten till "01" är 1.

Slutligen, för rad 14, returnerar GROUPIND_ID-funktionen 3, eftersom den binära motsvarigheten till '11' är 3.

Utdata från skriptet ovan ser ut så här:

Se även:

Microsoft:Grouping_ID-översikt

Microsoft:Grupperingsöversikt

YouTube:Grouping &Grouping_ID


  1. Maximal storlek för en varchar(max)-variabel

  2. Hur pg_dumpar man en RDS Postgres-databas?

  3. 13 bloggartiklar om bästa praxis och tips för databasdesign

  4. Hur väljer man den första raden för varje grupp i MySQL?