Torna all'elenco degli articoli Articoli
Tempo di lettura: 7 minuti

Chi ha lo stipendio più alto, in base al reparto? Usate SQL per scoprirlo!

Questo articolo mostra come ottenere lo stipendio totale per reparto di un'organizzazione, utilizzando la funzionalità GROUP BY di SQL. Spieghiamo indettaglio la clausola SQL GROUP BY e il filtro condizionale con la clausola HAVING.

Comprendere la spesa per gli stipendi di un'organizzazione è uno dei punti di partenza più comuni per i dirigenti aziendali. Aiuta a capire chi, all'interno dell'organizzazione, ha il costo salariale totale più alto, a seconda del reparto. Si potrebbe anche voler vedere la distribuzione dei pagamenti degli stipendi per avere un'idea più precisa dell'allocazione dei costi.

In questo articolo illustrerò come utilizzare il GROUP BY di SQL per raggiungere questo obiettivo. Se siete professionisti che possono utilizzare un'analisi di questo tipo o se siete studenti che cercano di capire la funzionalità SQL GROUP BY attraverso un caso d'uso pratico, continuate a leggere!

Prima di passare alla soluzione del problema, diamo un'occhiata al set di dati che utilizzeremo.

Il set di dati di esempio

employees:

employeenumberlastnamelevelannual_salarydepartment
1056Patterson1010000Finance
1076Firrel57000Marketing
1088Patterson1012500Finance
1102Bondur25000Human Resources
1143Bow25000Sales
1165Jennings25000Sales
1166Thompson1010000Marketing

Qui sopra è riportata una tabella employees con cinque colonne, con nomi di colonna autoesplicativi.

  • employeenumber: Identificatore univoco del dipendente.
  • lastname: Il cognome del dipendente.
  • level: Il livello del dipendente nella gerarchia.
  • annual_salary: Compenso annuale del dipendente.
  • department: Il reparto del dipendente.

Supponiamo di voler trovare la retribuzione annuale totale dei dipendenti appartenenti a diversi reparti, come finanza, marketing, risorse umane e vendite. Questo tipo di operazione sui dati è nota come aggregazione.

Che cos'è l'aggregazione?

Poiché è difficile analizzare ogni riga separatamente, soprattutto nel caso di insiemi di dati di grandi dimensioni, è spesso utile raggruppare dati simili per comprendere alcune statistiche per ciascuno di questi gruppi. Questa operazione è nota come aggregazione.

Si potrebbe voler raggruppare vari segmenti di clienti (aggregazione per segmento di clienti), calcolare la dimensione media degli ordini, calcolare le vendite totali per regione (aggregazione per area geografica) o controllare il numero totale di articoli di vari venditori su un sito web (aggregazione per venditore). Tutti questi sono esempi di aggregazione di dati che possono aiutare ad analizzare i dati e a generare approfondimenti.

In questo caso, vogliamo aggregare i dipendenti per reparto e calcolare lo stipendio totale (cioè la somma degli stipendi) di tutti i dipendenti appartenenti a quel reparto.

Si potrebbe pensare di poterlo fare facilmente per la tabella precedente, sommando gli stipendi a mano. Ma sicuramente avrete bisogno di un metodo più veloce se avete migliaia di dipendenti! È qui che la clausola SQL GROUP BY può aiutarvi.

La clausola SQL GROUP BY

La clausola SQL GROUP BY aiuta ad aggregare i dati in gruppi e a calcolare le statistiche relative a tali gruppi.

Nel nostro caso, è possibile utilizzare la seguente query per calcolare lo stipendio totale per reparto. I commenti spiegano brevemente la funzione di ciascun costrutto della query.

Query:

SELECT department,                        -- column to be returned
SUM(annual_salary)                        -- aggregate function
FROM employees                            -- table name
GROUP BY department;                      -- column to use for grouping

Output:

departmentSUM(annual_salary)
Finance22500
Marketing17000
Sales10000
Human Resources5000

Per aiutarvi a comprenderla meglio, vorrei approfondire la struttura di questa query e spiegare ogni clausola o parola chiave utilizzata.

Esempio di struttura di una query con clausola GROUP BY

Se dovessi disegnare uno scheletro o una struttura di esempio di una query SQL che utilizza la clausola GROUP BY, l'aspetto sarebbe questo. È possibile che non si utilizzino sempre tutti i costrutti, ma è utile comprenderli.

Struttura di esempio:

SELECT <columns>, <aggregate function>
FROM <table name>
WHERE <conditions>
GROUP BY <columns>
HAVING <aggregate condition>
ORDER BY <columns>

Nella nostra query per trovare lo stipendio totale per reparto, abbiamo usato solo le clausole SELECT, FROM e GROUP BY.

Vediamo come utilizzare ciascuno di questi costrutti.

Colonne SELECT e funzione aggregata

In questa parte della query si specificano le colonne da aggregare e restituire. Quindi, per il totale degli stipendi per reparto, il reparto è una delle colonne da restituire.

Qui si sceglie anche la funzione aggregata. La funzione aggregata è la metrica o la statistica che si desidera calcolare per la colonna raggruppata. Nel nostro caso, SUM() è la funzione aggregata. SQL fornisce anche altre utili funzioni aggregate integrate. In questa tabella sono riportate le varie funzioni aggregate e un esempio di utilizzo per ciascuna di esse.

Aggregate FunctionExample Use Case
SUM()Find the total salary by department
COUNT()Find the number of employees in each department
MAX()Find the highest salary paid in each department
MIN()Find the lowest salary paid in each department
AVG()Find the average salary for each department

Per modificare la statistica, è sufficiente utilizzare la funzione appropriata. Ad esempio, se si vuole calcolare il salario medio, si può usare:

Query:

SELECT department, AVG(annual_salary)
FROM employees
GROUP BY department;

Output:

departmentAVG(annual_salary)
Finance11250
Marketing8500
Sales5000
Human Resources5000

È anche possibile utilizzare più funzioni aggregate insieme. Ad esempio:

Query:

SELECT department, AVG(annual_salary), SUM(annual_salary)
FROM employees
GROUP BY department;

Output:

departmentAVG(annual_salary)SUM(annual_salary)
Finance1125022500
Marketing850017000
Sales500010000
Human Resource50005000

FROM <tabella(e) > e WHERE <condizioni>

In questa sezione si specificano le tabelle da cui si desidera ottenere le colonne e le condizioni da applicare alle colonne selezionate.

Supponiamo di voler ottenere dalla tabella i dati di due soli reparti, marketing e vendite. employees tabella.

Query:

SELECT department, SUM(annual_salary)
FROM employees
WHERE department in (‘Marketing’,’Sales’)
GROUP BY department;

Output:

departmentSUM(annual_salary)
Marketing17000
Sales10000

Elenco delle colonne da raggruppare con GROUP BY

In questa parte della query si specificano le colonne da utilizzare per raggruppare i dati. Abbiamo già visto il raggruppamento per reparto.

Una cosa a cui prestare attenzione: se si utilizzano più colonne nell'istruzione SELECT, è necessario includerle tutte nella clausola GROUP BY, tranne la colonna o le colonne utilizzate dalla funzione aggregata. In caso contrario, probabilmente si otterrà un errore. Consultate questo articolo per conoscere gli errori più comuni con GROUP BY e come evitarli.

Ad esempio, se si desidera aggregare SELECT e GROUP BY sia il reparto che il livello. La query sarà simile a questa.

Query:

SELECT department, level, SUM(annual_salary)
FROM employees
WHERE department in (‘Marketing’,’Sales’)
GROUP BY department, level;

Output:

departmentlevelSUM(annual_salary)
Marketing57000
Marketing1010000
Sales210000

Condizioni sulla funzione aggregata usando una clausola HAVING

È possibile scegliere di affinare e filtrare l'output di una query con una funzione aggregata utilizzando una clausola HAVING. Una clausola HAVING valuta le condizioni sull'output di una funzione aggregata e restituisce le righe che soddisfano tali criteri.

Quindi, se si desidera trovare tutti i reparti il cui stipendio medio è superiore a 7000, è possibile utilizzare la seguente query.

Query:

SELECT department, SUM(annual_salary)
FROM employees
GROUP BY department
HAVING AVG(annual_salary)>7000;

Output:

departmentSUM(annual_salary)
Finance22500
Marketing17000

Nota: non confondere la clausola WHERE con la clausola HAVING. Mentre una clausola WHERE filtra i record delle tabelle, una clausola HAVING filtra i gruppi.

Ordinamento con la clausola ORDER BY

Infine, è possibile ordinare i risultati utilizzando una clausola ORDER BY. Può essere usata per ordinare i risultati in ordine crescente o decrescente.

Per ordinare i reparti in ordine alfabetico, si può usare la seguente query.

Query:

SELECT department, level, SUM(annual_salary)
FROM employees
WHERE department in (‘Marketing’,’Sales’,’Human Resources’)
GROUP BY department,level
ORDER BY department asc;  -- asc is used for ascending, desc for descending

Output:

departmentlevelSUM(annual_salary)
Human Resource25000
Marketing57000
Marketing1010000
Sales210000

Per ulteriori esempi e casi d'uso della clausolaGROUP BY, consultare questo articolo.

Pronti a scrivere la vostra query SQL GROUP BY?

Se avete letto l'articolo fino a questo punto, sono certo che siete pronti a scrivere la vostra query SQL GROUP BY per ottenere il risultato desiderato. In questo articolo ho utilizzato molte query di esempio per farvi conoscere il processo di scrittura delle query. Credetemi, la pratica è il modo migliore per migliorare la scrittura delle query. Per esercitarvi con query come queste e altre, potete consultare il percorso SQL Practice di LearnSQL. È un modo completo per affinare ulteriormente le vostre abilità.

SQL è uno strumento molto potente, non solo per l'aggregazione dei dati, ma anche per molti altri casi d'uso che richiedono l'elaborazione e la manipolazione dei dati. In effetti, è una competenza indispensabile non solo per gli analisti di dati, ma per chiunque aspiri a lavorare in un ambiente in cui le decisioni vengono prese sulla base dei dati.

Se siete alle prime armi con SQL e volete saperne di più su come scrivere query SQL, vi consiglio vivamente il corso di LearnSQL per la scrittura di query di base. Vi darà una solida base per l'analisi dei dati con SQL e aumenterà ulteriormente la vostra carriera.

Quindi, cosa state aspettando? Iniziate oggi stesso!