Речення HAVING в агрегатних функціях SQL

У цьому посібнику ми обговоримо кілька способів використання або виконання пропозиції HAVING у агрегатних функціях SQL . Використання цього пункту в агрегатних функціях SQL може значно допомогти в узагальненні даних.

Речення HAVING майже схоже на оператор WHERE і також може виконуватися разом з ним.

Ми обговоримо їхні кореляції та відмінності, надавши приклади під час проходження цього підручника.

Зміст

Інструкції GROUP BY і WHERE у SQL

Для нашого першого прикладу ми обговоримо, як виконати та використати приклад таблиці нижче. Зауважте, що ми можемо використовувати речення WHERE лише з наявними стовпцями, а не лише в агрегатних функціях.

Речення HAVING в агрегатних функціях SQL

Припустімо, ми хочемо отримати загальний обсяг продажів продукту на основі його стовпця SaleAmount , де значення більше 2 . Щоб отримати результат, наша команда повинна бути наступною:

Речення HAVING в агрегатних функціях SQL

Спочатку ми вибираємо ProductName і об’єднуємо SaleAmount , щоб отримати TotalSales. 

Речення HAVING в агрегатних функціях SQL

Потім ми використали тут оператор WHERE , оскільки ми намагаємося отримати лише ті продукти, у яких SaleAmount перевищує 2. Команда «GROUP BY ProductName» вказує, що вона згрупує рядки під стовпцем ProductName в один.

Виконавши наш набір команд , ми побачимо, що з усіх даних у стовпцях ProductName і SaleAmount відображаються лише Bulb і Fan . Це тому, що вони були єдиними, хто мав SaleAmount , більший за 2.

Речення HAVING в агрегатних функціях SQL

У цьому прикладі оператор WHERE призначений для фільтрації результатів за наявним стовпцем, який є нашою SaleAmount . Також зауважте, що оператор WHERE з’являється перед GROUP BY і його не можна використовувати для фільтрації агрегатних функцій. З іншого боку, речення HAVING з’являється після GROUP BY і використовується для фільтрації на основі агрегатної функції. 

Речення GROUP BY і HAVING у SQL

У цьому прикладі ми збираємося продемонструвати різницю між інструкцією WHERE і пропозицією HAVING . Ми використаємо ту саму мету, що й у попередньому прикладі, щоб ми могли порівняти та оцінити результати. 

Давайте спочатку відобразимо товари з їхніми загальними продажами за допомогою наведеної нижче команди. Як бачите, наша перша команда залишається такою ж, як і наша перша команда, яка виконує оператор WHERE .

Речення HAVING в агрегатних функціях SQL

Якщо ми виконаємо перші дві команди, то отримаємо наступний результат:

Речення HAVING в агрегатних функціях SQL

Тепер, скажімо, ми хочемо відобразити лише продукти, загальний обсяг продажу яких перевищує 5. Ми не можемо використовувати оператор WHERE  , оскільки його можна використовувати лише з наявними стовпцями. Тому нам потрібно використовувати речення HAVING , оскільки ми будемо фільтрувати з агрегатної функції. 

Речення HAVING в агрегатних функціях SQL

Зверніть увагу, як ми використовуємо речення HAVING після GROUP BY на відміну від оператора WHERE , який використовується перед GROUP BY. Це пояснюється тим, що SQL згрупує записи перед тим, як обчислить речення HAVING

Давайте виконаємо ці команди разом із HAVING SUM(SaleAmount)>5 . Після вказівки, що ми хочемо отримати лише ті продукти, загальна ціна яких перевищує 5, ми помітимо, що в нашій поточній таблиці результатів ми більше не побачимо Pen . Це тому, що його загальна кількість менше 5

Речення HAVING в агрегатних функціях SQL

Коротше кажучи, коли ми хочемо відфільтрувати дані з нашої таблиці на основі наявного стовпця, ми використовуємо пропозицію WHERE , тоді як, коли ми хочемо відфільтрувати дані з агрегатної функції, ми використовуємо пропозицію HAVING

Речення HAVING і WHERE у SQL Server Management Studio (SSMS)

Тепер ми будемо рухатися вперед, обговорюючи та демонструючи, як ми можемо виконати пропозицію HAVING у (SSMS). Ми також розглянемо різницю між пропозиціями HAVING і WHERE , надавши приклади.

Нижче показано наш зразок даних SalesOrderHeader. Ці дані складаються зі 100 рядків. Для нашого прикладу ми хочемо отримати TotalSale за CustomerID , де TotalSale більше 10000 . Зауважте, що загальна сума продажу базується на сумі значень стовпця TotalDue .

Речення HAVING в агрегатних функціях SQL

По-перше, дозвольте мені продемонструвати, чому ми не можемо використовувати речення WHERE , коли ми хочемо фільтрувати агрегатну функцію на основі нашого прикладу вище. 

Ми будемо використовувати зразок набору команд із зображення нижче. Як ви бачите, технічно ми маємо той самий набір команд, що й у нашому першому прикладі.

Однак, коли ми натискаємо «Виконати» у верхньому лівому куті, це призведе до помилки, оскільки ми не можемо використовувати лише речення WHERE під час фільтрації за агрегатною функцією.

Речення HAVING в агрегатних функціях SQL

Щоб виправити помилку, нам потрібно відфільтрувати результат за допомогою пропозиції HAVING замість пропозиції WHERE . Наш новий набір команд має бути схожим на зображення нижче.

Речення HAVING в агрегатних функціях SQL

Тепер ми бачимо, що нашу помилку виправлено та містить результати заіз TotalSale понад 10000 .

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

Використання обох речень HAVING і WHERE у SQL  

Для цього прикладу, скажімо, ми хочемо використовувати пропозиції WHERE і HAVING одночасно. Давайте спробуємо отримати TotalSale за CustomerID , де TotalSale перевищує 10000 , але лише для клієнтів, у яких їхній TerritoryID дорівнює 1

Оскільки ми хочемо відфільтрувати результати за клієнтами, які мають 1 як TerritoryID , ми використаємо речення WHERE. Отже, наша команда має бути такою ж, як і наша попередня. Знову ж таки, ми додали речення WHERE перед реченням GROUP BY.

Речення HAVING в агрегатних функціях SQL

Наразі ми не бачимо великої різниці між нашим попереднім результатом і цим новим. Однак, якщо ви уважно подивіться на правий нижній кут, то тепер у нас лише 64 рядки порівняно з попереднім із 505 рядками даних. Це тому, що результати також фільтруються на основі їх TerritoryID .

Висновок

Підводячи підсумок, ми можемо використовувати речення WHERE лише з наявними стовпцями. Якщо нам потрібно фільтрувати за допомогою агрегованих функцій, замість цього потрібно використовувати речення HAVING .

Використання пропозиції HAVING у агрегатних функціях SQL і відпрацювання способів спільного виконання пропозицій HAVING і WHERE може забезпечити користувачам зручність під час роботи з великою кількістю даних або записів. 

Сподіваюся, я надав вам достатньо інформації та розуміння того, як використовувати речення HAVING у агрегатних функціях SQL. Якщо ви хочете дізнатися більше про цю тему та інший пов’язаний вміст, ви, звичайно, можете переглянути список відповідних посилань нижче.

Все найкраще,

Хафіз


Відкрийте для себе унікальні ідеї за допомогою функції TOPN LuckyTemplates

Відкрийте для себе унікальні ідеї за допомогою функції TOPN LuckyTemplates

У цьому блозі представлено функцію LuckyTemplates TOPN DAX, яка дає вам змогу отримувати унікальну статистику з ваших даних, допомагаючи вам приймати кращі маркетингові рішення.

Моделювання даних у LuckyTemplates за допомогою допоміжних таблиць

Моделювання даних у LuckyTemplates за допомогою допоміжних таблиць

Дізнайтеся про деякі фантастичні аналітичні прийоми, які ми можемо використовувати для моделювання даних у LuckyTemplates за допомогою таблиць підтримки DAX.

Розширений DAX для LuckyTemplates: впровадження логіки ранжування в унікальній статистиці

Розширений DAX для LuckyTemplates: впровадження логіки ранжування в унікальній статистиці

Тут ми зануримося в LuckyTemplates Advanced DAX і запровадимо логіку ранжирування, щоб отримати дуже унікальну інформацію. У цьому прикладі я також демонструю розгалуження міри.

Функція параметра LuckyTemplates «Що, якщо».

Функція параметра LuckyTemplates «Що, якщо».

У цьому блозі представлено нову функцію в LuckyTemplates — параметр аналізу «Що, якщо». Ви побачите, як це робить усе швидким і легким для аналізу сценарію.

Використовуйте розгалуження міри LuckyTemplates, щоб перевірити, чи зростає ваша маржа зі зростанням доходу

Використовуйте розгалуження міри LuckyTemplates, щоб перевірити, чи зростає ваша маржа зі зростанням доходу

Дізнайтеся, як визначити, чи добре зростає ваш дохід, перевіривши, чи зросла ваша маржа за допомогою розгалуження міри LuckyTemplates.

Параметри LuckyTemplates через редактор запитів

Параметри LuckyTemplates через редактор запитів

Дізнайтеся та зрозумійте, як можна створювати та використовувати параметри LuckyTemplates, які є потужною функцією редактора запитів.

Кругла гістограма – візуалізація для вашої інформаційної панелі

Кругла гістограма – візуалізація для вашої інформаційної панелі

У цьому підручнику буде обговорено створення круглої гістограми за допомогою Charticulator. Ви дізнаєтеся, як створити їх для звіту LuckyTemplates.

Функції та формули PowerApps | Вступ

Функції та формули PowerApps | Вступ

Дізнайтеся, як використовувати функції та формули PowerApps, щоб покращити функціональність і змінити поведінку в нашій програмі Canvas Power Apps.

Труба в R: підключення функцій за допомогою Dplyr

Труба в R: підключення функцій за допомогою Dplyr

У цьому підручнику ви дізнаєтесь, як об’єднати функції разом за допомогою оператора каналу dplyr мовою програмування R.

RANKX Deep Dive: функція LuckyTemplates DAX

RANKX Deep Dive: функція LuckyTemplates DAX

RANKX від LuckyTemplates дозволяє повернути рейтинг певного числа в кожному рядку таблиці, який є частиною списку чисел.