Select 2° parte


Nell’istruzione select
è possibile a seconda delle esigenze fare dei raggruppamenti
per le query effettuate, fare sei raggruppamenti significa dato
una tabella risultato accumulare i risultati che hanno lo stesso
contenuto in un campo o più di uno in un unico record.
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.

Select 2° parte ultima modifica: 2003-07-25T00:00:00+00:00 da Enrico

Related Posts

Comments are closed.