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

Informazioni sulle funzioni GROUPING e GROUPING_ID in SQL Server

Gli operatori ROLLUP e CUBE vengono utilizzati per restituire risultati aggregati dalle colonne nella clausola GROUP BY.

Le funzioni GROUPING e GROUPING_ID vengono utilizzate per identificare se le colonne nell'elenco GROUP BY sono aggregate (usando gli operatori ROLLUP o CUBE) o meno.

Esistono due differenze principali tra le funzioni GROUPING e GROUPING_ID.

Sono i seguenti:

  • La funzione GROUPING è applicabile su una singola colonna, mentre l'elenco di colonne per la funzione GROUPING_ID deve corrispondere all'elenco di colonne nella clausola GROUP BY.
  • La funzione GROUPING indica se una colonna nell'elenco GROUP BY è aggregata o meno. Restituisce 1 se il set di risultati è aggregato e 0 se il set di risultati non è aggregato.

D'altra parte, anche la funzione GROUPING_ID restituisce un numero intero. Tuttavia, esegue la conversione da binario a decimale dopo aver concatenato il risultato di tutte le funzioni GROUPING.

In questo articolo vedremo in azione le funzioni GROUPING e GROUPING_ID con l'aiuto di esempi.

Preparazione di alcuni dati fittizi

Come sempre, creiamo dei dati fittizi che useremo per l'esempio con cui lavoreremo in questo articolo.

Esegui il seguente 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')

Nello script sopra, abbiamo creato un database chiamato "Company". Abbiamo quindi creato una tabella “Impiegato” all'interno del database aziendale. Infine, abbiamo inserito alcuni record fittizi nella tabella Dipendente.

Funzione RAGGRUPPAMENTO

Come accennato in precedenza, la funzione GROUPING restituisce 1 se il set di risultati è aggregato e 0 se il set di risultati non è aggregato.

Dai un'occhiata al seguente script per vedere la funzione GROUPING in azione.

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)

Lo script sopra conta la somma degli stipendi di tutti i dipendenti, uomini e donne, che sono raggruppati prima dalla colonna Dipartimento e poi dalla colonna Genere. Vengono aggiunte altre due colonne per visualizzare il risultato della funzione RAGGRUPPAMENTO applicata al Dipartimento e le colonne Sesso.

L'operatore ROLLUP consente di visualizzare la somma degli stipendi sotto forma di totali generali e subtotali.

L'output dello script sopra è simile a questo.

Osserva attentamente l'output. La somma degli stipendi viene visualizzata per sesso in base al sesso del dipartimento (righe 1, 2, 4, 5, 7, 9, 10 e 12). Viene quindi aggregato anche solo per sesso (righe 3, 6, 8, 11 e 13). Infine, nella riga 14 viene visualizzato il totale complessivo delle retribuzioni aggregate per Dipartimento e Genere.

1 viene visualizzato nella colonna della funzione GROUPING GP_Gender per le righe in cui i risultati sono aggregati per genere, ad esempio le righe 3, 6, 8, 11 e 13. Questo perché la colonna GP_Gender contiene il risultato della funzione GROUPING applicata alla colonna Gender.

Allo stesso modo, la riga 14 contiene la somma aggregata di tutti i reparti e di tutte le colonne. Pertanto viene restituito 1 per entrambe le colonne GP_Department e GP_Gender.

Puoi vedere che NULL viene visualizzato nelle colonne Dipartimento e Sesso nell'output in cui i risultati vengono aggregati. Ad esempio, nella riga 3, NULL viene visualizzato nella colonna Sesso perché i risultati vengono aggregati per colonna di sesso e quindi non è presente alcun valore di colonna da visualizzare. Non vogliamo che i nostri utenti vedano NULL, una parola migliore qui potrebbe essere "Tutti i sessi".

Per fare ciò, dobbiamo modificare il nostro script come segue:

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)

Nello script precedente, se la funzione RAGGRUPPAMENTO applicata alla colonna Reparto restituisce 1 e nella colonna Reparto viene visualizzato "Tutti i reparti". Altrimenti, se la colonna Dipartimento contiene il valore NULL, visualizzerà "Sconosciuto". La colonna del sesso è stata modificata allo stesso modo.

L'esecuzione dello script precedente restituisce i seguenti risultati:

Puoi vedere che NULL nelle colonne Dipartimento e Sesso in cui la funzione GROUPING restituisce 1, è stato sostituito rispettivamente con "Tutti i reparti" e "Tutti i sessi".

Funzione GROUPING_ID

La funzione GROUPING_ID concatena l'output delle funzioni GROUPING applicate a tutte le colonne specificate nella clausola GROUP BY. Quindi esegue la conversione da binario a decimale prima di restituire l'output finale.

Concateniamo prima l'output restituito dalla funzione GROUPING applicata alle colonne Department e Gender. Dai un'occhiata al seguente 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)

Nell'output, vedrai 0 e 1 restituiti dalla funzione GROUPING concatenati insieme. L'output è simile a questo:

La funzione GROUPING_ID restituisce semplicemente l'equivalente decimale del valore binario formato come risultato della concatenazione dei valori restituiti dalle funzioni GROUPING.

Esegui il seguente script per vedere la funzione GROUPING ID in azione:

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)

Per la riga 1, la funzione GROUPING ID restituirà 0 poiché l'equivalente decimale di '00' è zero.

Per le righe 3, 6, 8, 11 e 13, la funzione GROUPING_ID restituisce 1 poiché l'equivalente decimale di '01' è 1.

Infine, per la riga 14, la funzione GROUPIND_ID restituisce 3, poiché l'equivalente binario di '11' è 3.

L'output dello script sopra è simile al seguente:

Vedi anche:

Microsoft:Panoramica Grouping_ID

Microsoft:Panoramica sui raggruppamenti

YouTube:raggruppamento e raggruppamento_ID