Problema:
Devi trovare le righe in cui i gruppi hanno una somma di valori in una colonna inferiore a un determinato valore.
Esempio:
Il nostro database ha una tabella denominata company
con i dati nelle seguenti colonne:id
, department
, first_name
, last_name
e salary
.
id | reparto | nome | cognome | stipendio |
---|---|---|---|---|
1 | marketing | Lora | Marrone | 2300 |
2 | finanza | Giovanni | Jackson | 3200 |
3 | marketing | Michele | Thomson | 1270 |
4 | produzione | Tony | Mugnaio | 6500 |
5 | produzione | Sally | Verde | 2500 |
6 | finanza | Olivier | Nero | 3450 |
7 | produzione | Jennifer | Michelin | 2800 |
8 | marketing | Jeremy | Lorson | 3600 |
9 | marketing | Luigi | Fabio | 4200 |
Troviamo i nomi dei reparti che hanno somme degli stipendi dei suoi dipendenti inferiori a 7000.
Soluzione:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Ecco il risultato:
dipartimento | somma |
---|---|
finanza | 6550 |
Discussione:
Per filtrare i record utilizzando la funzione di aggregazione (la funzione SUM di prima), utilizzare la clausola HAVING. Per calcolare la somma dei valori per ogni gruppo di righe, utilizzare la funzione SOMMA di aggregazione. In questa query, il reparto colonne viene calcolato con la somma di tutti gli stipendi dei suoi dipendenti come gruppo (calcolalo con la funzione SOMMA con lo stipendio colonna come argomento). Poiché si calcola il valore per ogni gruppo di righe (raggruppiamo le righe in base al nome del dipartimento), la query ha una clausola GROUP BY con il nome della colonna per raggruppare le righe (nel nostro esempio, GROUP BY department
). L'ultimo passaggio consiste nell'usare la funzione di aggregazione nella clausola HAVING. Ricorda, HAVING dovrebbe essere inserito dopo la clausola GROUP BY. HAVING contiene la condizione che confronta il valore restituito dalla funzione di aggregazione con un dato valore. Dall'alto, sono le somme salariali con un valore inferiore a 7000 (SUM(salary)<7000
). Qui verifichiamo che la somma salariale in ciascun dipartimento sia inferiore a 7000. La query mostrava solo un dipartimento, finanza, con stipendi di 6550.