20th Jul 2022 Tempo di lettura: 7 minuti Chi ha lo stipendio più alto, in base al reparto? Usate SQL per scoprirlo! Himanshu Kathuria sql imparare sql GROUP BY Indice Il set di dati di esempio Che cos'è l'aggregazione? La clausola SQL GROUP BY Esempio di struttura di una query con clausola GROUP BY Colonne SELECT e funzione aggregata FROM <tabella(e) > e WHERE <condizioni> Elenco delle colonne da raggruppare con GROUP BY Condizioni sulla funzione aggregata usando una clausola HAVING Ordinamento con la clausola ORDER BY Pronti a scrivere la vostra query SQL GROUP BY? 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! Tags: sql imparare sql GROUP BY