Фільтрування груп за допомогою функції HAVING

Завершено

Створивши групи з реченням GROUP BY, можна додатково відфільтрувати результати. Речення HAVING діє як фільтр для груп. Це схоже на те, як речення WHERE діє як фільтр для рядків, повернутих реченням FROM.

Речення HAVING дає змогу створити умову пошуку, концептуально подібну до предикату речення WHERE, яка потім перевіряє кожну групу, повернуту реченням GROUP BY.

У наведеному нижче прикладі підраховується кількість замовлень для кожного клієнта та фільтрується результати, щоб включити лише клієнтів, які розмістили більше 10 замовлень:

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

Порівняти HAVING з WHERE

Хоча речення HAVING і WHERE фільтрують дані, пам'ятайте, що WHERE працює в рядках, повернутих реченням FROM. Якщо A GROUP BY ... Розділ HAVING існує в запиті після речення WHERE, речення WHERE фільтруватиме рядки перед обробкою GROUP BY, що потенційно обмежує групи, які можна створити.

Речення HAVING обробляється після GROUP BY і працює лише для груп, а не в рядках із докладними відомостями. Щоб підсумувати:

  • Речення WHERE фільтрує рядки перед формуванням будь-яких груп
  • Речення HAVING фільтрує цілі групи та зазвичай переглядає результати агрегації.