Layer 06

Select 2° parte

Per fare questo dobbiamo utilizzare l’espressione group by. Di seguito riporto la sua sintassi generale:

Select
from ….
group by nomecol1 [,nomecol2,…]

Un requisito dello specificare la clausola group by è quello di riportare le stesse colonne utilizzate nella funzione di group by anche nella select, per un capo essere inserito in group by significa che deve essere inserito necessariamente in select.

In parole povere utilizzare una group by significa associare delle funzioni di raggruppamento quali max, count, avg, min etc .etc. ad un gruppo di risultati aventi gli stessi valori per i campi specificati in group by.

Per rendere più chiaro l’utilizzo facciamo un esempio:
Abbiamo una tabella con tutte le vendite effettuate dalla nostra azienda, la tabella si chiama FATTURE
Per visualizzare tutte le fatture del mese di giugno anno 2003 utilizzeremo questa query:

select numero, cliente, articolo, prezzo
from fatture
where mese=’06’ and anno=’2003′

atterremo una tabella con n righe ma le fatture saranno sicuramente meno delle righe visualizzate, supponendo di vendere più di un articolo per fattura.
Ora dobbiamo sapere quante fatture per cliente abbiamo in quel mese, dovremo quindi raggruppare le fatture per cliente e contare quanti numerid i fattura abbiamo.
Utilizzeremo un group by per cliente ed una funzione count (distinct numero), usiamo il distinct altrimenti ci ritroveremmo a contare quante righe di fatture, ovvero quanti articoli (non distinti) abbiamo venduto al cliente. La query sarà come segue:

select cliente, count(distinct numero) as Fatture
from fatture
where mese=’06’ and anno=’2003′
group by cliente

per ogni cliente presente nel mese troveremo quante fatture abbiamo venduto.
In questo modo (utilizzando group by) possiamo ottenere anche il prezzo medio di vendita di un dato articolo in un anno o in un mese. In questo modo:

select articolo, avg(prezzo) as prezzo_medio
from fatture
where anno=’2002′
group by articolo

Clausola HAVING, ovvero come controllare le funzioni di aggragazione:
ora però potremmo avere il problema di dover controllare anche le funzioni di raggruppamento, ad esempio voglio sapere quali sono gli articolo che l’anno scorso hanno avuto un prezzo medio superiore a 500 euro, e qui entra in gioco la clausola having.
Essa funziona in tutto e per tutto come la clausola where, è però dedicata appunto alle funzioni di raggruppamento e va utilizzata solo e soltanto con la presenza di group by.
Risolvendo il nostro problema dei prezzi medi dell’annos corso superiori ai 500 euro, la query sarà come segue:

select articolo, avg(prezzo)
from fatture
where anno=’2003′
group by articolo
having avg(prezzo)>=500

La funzione having però non ha vincoli sul controllo delle funzioni di aggrgazione come per select e group by, essa infatti può controllare altre funzioni di aggregazione, esempio se dobbiamo trovare il prezzo medio di quegli articoli dell’anno scorso che però sono stati venduti almeno 4 volte, dovrò controllare nella clausola having count (articolo):

select articolo, avg(prezzo)
from fatture
where anno=’2003′
group by articolo
having count(articolo)>=4

E se volessi complicarmi la vita? 🙂 se volessi controllare sempre il prezzo medio di quegli articoli che sono stati venduti l’anno scorso ad almeno 4 clienti diversi? farò un count (distinct articolo, cliente)>=4:

select articolo, avg(prezzo)
from fatture
where anno=’2003′
group by articolo
having count(distinct articolo, cliente)>=4

Le funzioni di aggregazione a livello statistico sono molto utili e risolvono tanti problemi di programmazione, personalmente credo che SQL sia un ottimo linguaggio per i sistemi di reportistica.]]>