Filtrare i gruppi con HAVING

Completato

Dopo aver creato i gruppi con una clausola GROUP BY, è possibile filtrare ulteriormente i risultati. La clausola HAVING funge da filtro nei gruppi. Così come la clausola WHERE funge da filtro nelle righe restituite dalla clausola FROM.

La clausola HAVING consente di creare una condizione di ricerca, concettualmente simile al predicato di una clausola WHERE, che testa ogni gruppo restituito dalla clausola GROUP BY.

L'esempio seguente conta gli ordini per ogni cliente e filtra i risultati in modo da includere solo i clienti che hanno effettuato più di 10 ordini:

SELECT CustomerID,
      COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;

Confrontare HAVING con WHERE

Sebbene entrambe le clausole HAVING e WHERE filtrino i dati, tenere presente che WHERE opera sulle righe restituite dalla clausola FROM. Se nella query è presente una sezione GROUP BY ... HAVING che segue una clausola WHERE, la clausola WHERE filtra le righe prima che GROUP BY venga elaborata, limitando potenzialmente i gruppi che possono essere creati.

La clausola HAVING viene elaborata dopo GROUP BY e opera solo su gruppi, non su righe di dettaglio. Per concludere:

  • La clausola WHERE filtra le righe prima che vengano formati i gruppi
  • Una clausola HAVING filtra interi gruppi e in genere esamina i risultati di un'aggregazione.