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 raggruppamento
Tra 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.
Istruzione SQL
SELECT Classe, Sezione, Count(Classe) AS AlunniPerClasse
FROM STUDENTI
GROUP BY Classe AND Sezione
Raggruppa i dati per classe e sezione: per ogni classe così individuata calcola
quanti record esistono nella tabella Studenti (quindi numero di alunni per classe)
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 incrociati
Utilizzando 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:
HobbiesStudenti
ID_S |
Hobby |
NOre |
Settimana |
001 |
Calcio |
4 |
1 |
001 |
Calcio |
3 |
2 |
001 |
Calcio |
4 |
3 |
001 |
Calcio |
1 |
4 |
001 |
Lettura |
5 |
1 |
001 |
Lettura |
2 |
2 |
001 |
Basket |
5 |
2 |
001 |
Studio |
1 |
10 |
001 |
Studio |
2 |
8 |
002 |
Calcio |
3 |
1 |
002 |
Calcio |
1 |
2 |
002 |
Calcio |
1 |
3 |
002 |
Calcio |
0 |
4 |
002 |
Lettura |
8 |
1 |
002 |
Lettura |
16 |
2 |
002 |
Basket |
1 |
2 |
002 |
Studio |
2 |
10 |
002 |
Studio |
1 |
8 |
003 |
Studio |
3 |
1 |
003 |
Studio |
1 |
2 |
003 |
Studio |
1 |
3 |
003 |
Studio |
0 |
4 |
003 |
Lettura |
8 |
1 |
003 |
Lettura |
16 |
2 |
003 |
Basket |
1 |
2 |
003 |
Calcio |
2 |
10 |
003 |
Calcio |
1 |
8 |
|
STUDENTI
ID_Studente |
Nome |
Cognome |
Città |
001 |
Stefano |
Moro |
Crema |
002 |
Marco |
Banfi |
Pandino |
003 |
Ivan |
Colombo |
Crema |
004 |
Maurizio |
Pozzi |
Cremona |
005 |
Andrea |
Tarantini |
|
|
Non è certo comodo leggere i dati in questo formato, soprattutto se servono rilevazioni
di tipo statistico. Vediamo cosa se ne può ricavare:
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.
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.
Home
Lezione 2
Lezione 4