TOP

Lezione SQL 8. Raggruppamento dei dati (GROUP BY)

Il raggruppamento dei dati consente di dividere tutti i dati in set logici, il che rende possibile eseguire calcoli statistici separatamente in ciascun gruppo.


1. Creazione di gruppi (GROUP BY)

I gruppi vengono creati utilizzando l'istruzione GROUP BY dell'operatore SELECT. Consideriamo un esempio.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product

Con questa richiesta abbiamo estratto informazioni sul numero di prodotti venduti in ogni mese. L'operatore SELECT ordina di restituire due colonne Product - il nome del prodotto e Product_num - il campo calcolato che abbiamo creato per visualizzare la quantità di prodotti venduti (formula del campo SUM(Quantity)). La clausola GROUP BY indica al DBMS di raggruppare i dati in base alla colonna Product.

Vale anche la pena notare che GROUP BY deve venire dopo la clausola WHERE e prima di ORDER BY.

2. Filtrare i gruppi (HAVING)

Proprio come abbiamo filtrato le righe in una tabella, possiamo filtrare i dati raggruppati. Per questo esiste l'operatore HAVING in SQL. Prendiamo l'esempio precedente e aggiungiamo il filtro di gruppo.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Possiamo vedere che dopo aver calcolato il numero di beni venduti per ciascun prodotto, il DBMS "ha tagliato" quei prodotti che sono stati venduti meno di 4.000 unità.

Come puoi vedere, l'operatore HAVING è molto simile all'operatore WHERE, ma c'è una differenza significativa tra loro: WHERE filtra i dati prima che vengano raggruppati e HAVING filtra dopo il raggruppamento. Pertanto, le righe rimosse dalla clausola WHERE non verranno incluse nel gruppo. Pertanto, gli operatori WHERE e HAVING possono essere utilizzati nella stessa frase. Considera un esempio:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
WHERE Product <> 'Skis Long' 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Abbiamo aggiunto l'operatore WHERE all'esempio precedente, dove abbiamo specificato il prodotto "Sci Lunghi", che a sua volta ha influenzato il raggruppamento tramite l'operatore HAVING. Di conseguenza possiamo vedere che il prodotto "Sci Lunghi" non è entrato nell'elenco dei gruppi con più di 4.000 prodotti venduti.

3. Raggruppamento e ordinamento

Come con il normale campionamento dei dati, possiamo ordinare i gruppi dopo averli raggruppati con l'operatore HAVING. Per questo possiamo usare l'operatore già familiare ORDER BY. In questa situazione, la sua applicazione è simile agli esempi precedenti. Esempio:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)

o semplicemente specificare il numero del campo nell'ordine in cui vogliamo ordinare:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY 2

Vediamo che per ordinare i risultati di riepilogo, dobbiamo solo scrivere la clausola con ORDER BY dopo l'operatore HAVING.

MS Access non supporta l'ordinamento dei gruppi per alias di colonna, ovvero nel nostro esempio, per ordinare i valori, non potremo scrivere ORDER BY Product_num alla fine della query.