Lezione 3 – SQL: Query di raggruppamento
Che cosa significa “raggruppare”?
Funzioni delle query di raggruppamento
Parole del linguaggio: GROUP BY …
Un passo avanti: le query a campi incrociati
Che cosa significa “raggruppare”?
Capita con una notevole frequenza di dover effettuare calcoli o statistiche su dati memorizzati, che abbiano qualche caratteristica in comune.
SQL mette a disposizione, a questo scopo, un potente strumento: le query di raggruppamento.
Raggruppare significa “mettere insieme” tutti i dati, accomunati da qualche caratteristica, su cui vanno fatti alcuni tipi di conti.
Per esempio si determina con una semplice query di raggruppamento l’individuazione dell’età minima o massima o il voto medio degli alunni di una classe; oppure la somma dei prezzi degli ordini ricevuti da un’azienda in una giornata e via dicendo.
Funzioni delle query di raggruppamentoTra le operazioni realizzabili con questo strumento si ricordano:
- Sum: somma i valori contenuti nel campo a cui si riferisce, per tutti i record del raggruppamento
- Min: calcola il minimo tra i valori contenuti nel campo a cui si riferisce, per tutti i record del raggruppamento
- Max: calcola il massimo tra i valori contenuti nel campo a cui si riferisce, per tutti i record del raggruppamento
- Avg: calcola il valor medio tra quelli contenuti nel campo a cui si riferisce, per tutti i record del raggruppamento
- Count: conta il numero dei record del raggruppamento
La sintassi relativa all’attivazione di una funzione è SELECT nome_funzione(nome_campo) AS alias
significa che verrà realizzato il calcolo indicato dalla funzione sui record del raggruppamento. Nella tabella risultante la colonna a cui corrisponderà l’uscita della funzione avrà come intestazione l’alias indicato dall’istruzione SQL
Parole del linguaggio: GROUP BY …La sintassi relativa alla definizione di un raggruppamento èGROUP BY nome_tab.nome_campo
significa che verranno aggregati tutti i record selezionati nella query che abbiano uguale contenuto del campo indicato. Su questi record verrà attivata la funzione specificata.
Esempio 1
Istruzione SQL
SELECT Classe, Sezione, Count(Classe) AS AlunniPerClasse
FROM STUDENTI
GROUP BY Classe AND SezioneRaggruppa i dati per classe e sezione: per ogni classe così individuata calcola quanti record esistono nella tabella Studenti (quindi numero di alunni per classe)
Esempio 2
Istruzione SQL
SELECT STUDENTI.Classe, Avg(VOTI.Voto) AS MediaDiVoto
FROM STUDENTI INNER JOIN VOTI ON STUDENTI.ID_S = VOTI.ID_S
GROUP BY STUDENTI.Classe
Raggruppa i dati per classe: calcola il valor medio di tutti i campi “Voto” appartenenti a record che abbiano uguale valore del campo “Classe” (quindi voto medio per classe)
Come si può intuire, è possibile realizzare una query di raggruppamento sia utilizzando i dati di una tabella, sia lavorando su più tabelle in relazione. Nel secondo caso, però, è opportuno specificare sempre il nome della tabella a cui appartiene ogni singolo campo.
Un passo avanti: le query a campi incrociatiUtilizzando lo stesso meccanismo del raggruppamento, è possibile realizzare da una RecordSet di DataBase la visualizzazione di una tabella a doppia entrata. Naturalmente i dati contenuti nel Recordset devono essere tali da permettere una rappresentazione del genere.
Si supponga, per esempio, di avere memorizzato anche i dati delle ore che gli studenti del DB dedicano a passatempi di vario tipo:
Non è certo comodo leggere i dati in questo formato, soprattutto se servono rilevazioni di tipo statistico. Vediamo cosa se ne può ricavare:
Esempio 3
Istruzione SQL
TRANSFORM Sum(HobbiesStudenti.NOre) AS SommaDiNOre
SELECT STUDENTI.Cognome
FROM HobbiesStudenti INNER JOIN STUDENTI ON HobbiesStudenti.ID_S = STUDENTI.ID_S
GROUP BY STUDENTI.Cognome
PIVOT HobbiesStudenti.Hobby;
Totale delle ore dedicate da ogni studente ad ogni attività.
Realizza un RecordSet con le due tabelle in relazione STUDENTI e HobbiesStudenti.
Applica la funzione Sum (SOMMA) al campo NOre. Lo stesso campo è il valore rappresentato nella tabella.
Crea una tabella a doppia entrata, in cui Cognome è l’indice di riga e Hobby è l’indice di colonna.
SELECT e GROUP BY individuano il campo = indice di riga.
PIVOT individua il campo = indice di colonna.
Raggruppa i dati sia per Cognome, sia per Hobby.
Esempio 4
Istruzione SQL
TRANSFORM Avg(HobbiesStudenti.NOre) AS MediaDiNOre
SELECT STUDENTI.Cognome
FROM HobbiesStudenti INNER JOIN STUDENTI ON HobbiesStudenti.ID_S = STUDENTI.ID_S
GROUP BY STUDENTI.Cognome
PIVOT HobbiesStudenti.Hobby;
Calcolo del numero medio di ore settimanali dedicate da ogni studente ad ogni attività.
Realizza un RecordSet con le due tabelle in relazione STUDENTI e HobbiesStudenti.
Applica la funzione Avg (MEDIA) al campo NOre. Lo stesso campo è il valore rappresentato nella tabella.
Crea una tabella a doppia entrata, in cui Cognome è l’indice di riga e Hobby è l’indice di colonna.
SELECT e GROUP BY individuano il campo = indice di riga.
PIVOT individua il campo = indice di colonna.
Raggruppa i dati sia per Cognome, sia per Hobby.