Filtrera grupper med HAVING
När du har skapat grupper med en GROUP BY-sats kan du filtrera resultatet ytterligare. HAVING-satsen fungerar som ett filter för grupper. Detta liknar hur WHERE-satsen fungerar som ett filter på rader som returneras av FROM-satsen.
Med en HAVING-sats kan du skapa ett sökvillkor som konceptuellt liknar predikatet för en WHERE-sats, som sedan testar varje grupp som returneras av GROUP BY-satsen.
I följande exempel räknas beställningarna för varje kund och resultatet filtreras så att endast kunder som har lagt fler än 10 beställningar inkluderas:
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
Jämför ATT BEHÖVA MED WHERE
Även om både HAVING- och WHERE-satser filtrerar data, kom ihåg att WHERE fungerar på rader som returneras av FROM-satsen. Om en GROUP BY ... HAVING-avsnittet finns i din fråga efter en WHERE-sats, WHERE-satsen filtrerar rader innan GROUP BY bearbetas, vilket potentiellt begränsar de grupper som kan skapas.
En HAVING-sats bearbetas efter GROUP BY och fungerar bara på grupper, inte på detaljrader. Sammanfattningsvis:
- En WHERE-sats filtrerar rader innan några grupper bildas
- En HAVING-sats filtrerar hela grupper och tittar vanligtvis på resultatet av en aggregering.