Home

Lezione 2

Lezione 4

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:
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 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)

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 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:

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.


Home

Lezione 2

Lezione 4