Filtrare i gruppi con HAVING

Completato

Dopo aver creato gruppi con una clausola GROUP BY, è possibile filtrare ulteriormente i risultati. La clausola HAVING funge da filtro per i gruppi. È simile al modo in cui la clausola WHERE funge da filtro per le righe restituite dalla clausola FROM.

Una clausola HAVING consente di creare una condizione di ricerca, concettualmente simile al predicato di una clausola WHERE, che quindi 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 to WHERE

Mentre entrambe le clausole HAVING e WHERE filtrano i dati, tenere presente che WHERE opera sulle righe restituite dalla clausola FROM. Se un GROUP BY ... La sezione HAVING esiste nella query dopo una clausola WHERE, la clausola WHERE filtra le righe prima dell'elaborazione di GROUP BY, limitando potenzialmente i gruppi che è possibile creare.

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

  • Una clausola WHERE filtra le righe prima del formato di tutti i gruppi
  • Una clausola HAVING filtra interi gruppi e in genere esamina i risultati di un'aggregazione.