Filtrer grupper med HAVING
Når du har oprettet grupper med en GROUP BY-delsætning, kan du filtrere resultaterne yderligere. HAVING-delsætningen fungerer som et filter på grupper. Dette svarer til den måde, WHERE-delsætningen fungerer som et filter på rækker, der returneres af FROM-delsætningen.
En HAVING-delsætning giver dig mulighed for at oprette en søgebetingelse, der konceptuelt ligner prædikatet for en WHERE-delsætning, som derefter tester hver gruppe, der returneres af GROUP BY-delsætningen.
I følgende eksempel tælles ordrerne for hver kunde, og resultaterne filtreres, så de kun omfatter kunder, der har afgivet mere end 10 ordrer:
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
Sammenlign HAVING med WHERE
Selvom både HAVING- og WHERE-delsætninger filtrerer data, skal du huske, at WHERE fungerer på rækker, der returneres af FROM-delsætningen. Hvis en GRUPPÉR EFTER ... HAVING-sektionen findes i din forespørgsel efter en WHERE-delsætning, hvor WHERE-delsætningen filtrerer rækker, før GROUP BY behandles – hvilket kan begrænse de grupper, der kan oprettes.
En HAVING-delsætning behandles efter GROUP BY og fungerer kun på grupper og ikke detaljerækker. Sådan opsummerer du:
- En WHERE-delsætning filtrerer rækker, før der dannes grupper
- En HAVING-delsætning filtrerer hele grupper og ser normalt på resultaterne af en sammenlægning.