Visual Basic Simple
Il linguaggio SQL
Le clausole GROUP BY e HAVING
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Ricerca personalizzata

Difficoltà: 3 / 5

Le funzioni di aggregazione trattate nell'articolo precedente trovano il loro connubbio naturale con la clausola GROUP BY, utilizzata, come ne dice il nome, per suddividere in gruppi le righe estratte mediante istruzione SELECT. La sintassi generale, molto semplice è la seguente:

GROUP BY <campi>

È applicata alle selezioni per suddividere i risultati in gruppi distinti per valore nei campi specificati. Spiegare il funzionamento non è semplice e ci avvaleremo di alcuni esempi per renderlo più chiaro. Data la solita selezione dei direttori dalle tabella degli impiegati:

SELECT nome, cognome, stipendio FROM impiegati WHERE ruolo='Direttore'

Possiamo avere la necessità di recuperare il costo medio oppure totale suddiviso per ruolo. Sappiamo di poter sfruttare le funzioni di aggregazione AVG e SUM per ottenere questi dati ma tutti gli esempi che abbiamo già visto restituivano sempre e soltanto una singola riga, come totale o media di tutte le righe richieste dalla clausola WHERE (o dall'intera tabella in assenza della clausola). Vediamo invece come spaccare il set di risultati in più gruppi, ognuno dei quali con il proprio criterio di aggregazione:

SELECT ruolo, AVG(stipendio) AS media, SUM(stipendio) AS somma
FROM dipendenti GROUP BY ruolo

Restituirà tre colonne in cui la prima conterrà il ruolo del gruppo di dipendenti, la seconda lo stipendio medio del gruppo cui appartengono e la terza la somma degli stipendi di ogni gruppo di persone:

RUOLO MEDIA SOMMA
Impiegato 1000 5000
Direttore 3100 9500

È importante capire il funzionamento della clausola GROUP BY e delle funzioni di aggregazione, perché il loro comportamento è ben differente da quello delle altre clausole; affinchè sia possibile il raggruppamento è necessario che tutti i campi coinvolti nella selezione siano raggruppati. Nell'esempio precedente esiste un criterio di raggruppamento dato dal campo ruolo che segue la clausola GROUP BY, mentre gli altri due campi contengono funzioni di aggregazione che, come abbiamo già visto, restituiscono sempre un'unica riga. L'espressione contiene quindi tre campi raggruppati.

Il principio di fondo delle funzioni di aggregazione e della clausola GROUP BY è infatti questo: tutti i campi devono rappresentare un raggruppamento, dettato da un'aggregazione oppure da una clausola GROUP BY. Questa è la ragione per cui questa clausola costituisce il complemento delle funzioni viste nell'articolo precedente.

Vediamo qualche altro esempio:

SELECT ruolo, stipendio, COUNT(stipendio) AS conta, SUM(stipendio) AS somma
FROM dipendenti GROUP BY ruolo, stipendio

Questa selezione restituisce lo stipendio, il numero di dipendententi e la spesa totale differenziata per ciascun valore di stipendio. Nell'esempio ciò che riporterà saranno i dati seguenti:

RUOLO STIPENDIO CONTA SOMMA
Impiegato 1000 5 5000
Direttore 2700 1 2700
Direttore 3400 2 6800

Anche in questo caso tutti i campi sono ragguppati; i primi due sono regolati dalla clausola GROUP BY, gli ultimi due dalle funzioni di aggregazione. Possiamo notare la presenza di due righe con il ruolo Direttore, ma differenziate per stipendio. I cinque impiegati sono invece raggruppati su un'unica riga perchè tutti con lo stesso stipendio.

Se il database lamenta qualcosa circa l'assenza di un campo dell'istruzione SELECT all'interno delle clausola GROUP BY oppure delle funzioni di aggregazione la ragione è quella già accennata: tutti i campi dell'istruzione devono essere raggruppati in una delle due maniere già accennate.


La clausola HAVING rappresenta un vincolo sui dati risultanti dall'operazione di raggruppamento. Il suo funzionamento è molto simile a quello della clausola WHERE ma anziché operare sui campi del database opera sui raggruppamenti; i campi richiesti possono essere sia quelli delle funzioni di aggregazione sia quelli indicati nelle clausole GROUP BY.

Riprendendo l'esempio precedente per estrarre soltanto quelle righe in cui il numero di dipendenti sia maggiore di 1:

SELECT ruolo, stipendio, COUNT(stipendio) AS conta, SUM(stipendio) AS somma
FROM dipendenti GROUP BY ruolo, stipendio HAVING COUNT(stipendio) > 1

Si tratta dello stesso esempio precedente, ma con l'aggiunta di una clausola HAVING che richiede che il numero di stipendi sia superiore a 1; il suo utilizzo è molto simile a quello della clausola WHERE ma richiede la specifica di un criterio di raggruppamento o aggregazione.

Fibia FBI
17 Marzo 2004

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'indice della sezione Database