در SQL Server زمانی که داده‌ها را با دستور GROUP BY گروه‌بندی می‌کنیم، معمولاً قصد داریم بر اساس نتایج تجمیعی روی گروه‌ها شرط بگذاریم. در این حالت WHERE کاربرد ندارد چون شرط در داده‌های خام اعمال می‌شود نه روی داده‌های گروه‌بندی‌شده. برای این منظور از دستور HAVING استفاده می‌شود. منابع معتبر انگلیسی همواره HAVING را به‌عنوان ابزاری کلیدی برای فیلتر کردن گروه‌ها معرفی می‌کنند.

تعریف و کاربرد HAVING

  • دستور HAVING برای تعیین شرط روی گروه‌های حاصل از عملیات تجمیعی مانند SUM، COUNT، AVG و غیره به کار می‌رود.
  • این دستور پس از GROUP BY نوشته می‌شود و فقط گروه‌هایی که شرط HAVING را برآورده کنند در خروجی باقی می‌مانند.

تفاوت کلیدی بین WHERE و HAVING

  • WHERE روی هر ردیف جداگانه پیش از گروه‌بندی شرط می‌گذارد.
  • HAVING روی نتایج گروه‌بندی شده اعمال می‌شود.

مثال‌های کاربردی

فرض کنید جدولی به نام Sales داریم با ستون‌های Region و Amount که مقادیر فروش هر منطقه را نشان می‌دهد.

مثال 1: فیلتر گروه‌ها با مجموع فروش بیشتر از 10000

SELECT Region, SUM(Amount) AS TotalSales

FROM Sales

GROUP BY Region

HAVING SUM(Amount) > 10000;

در این مثال، ابتدا فروش‌ها بر اساس منطقه گروه‌بندی می‌شوند، سپس فقط مناطقی که مجموع فروش آن‌ها بیش از 10000 باشد نمایش داده می‌شوند.

مثال 2: فیلتر گروه‌ها با تعداد رکوردهای بیشتر از 50

SELECT Region, COUNT(*) AS NumberOfSales

FROM Sales

GROUP BY Region

HAVING COUNT(*) > 50;

در اینجا گروه‌هایی نمایش داده می‌شوند که بیش از 50 رکورد فروش داشته باشند.

ترکیب HAVING با شروط دیگر

می‌توان شرط‌های HAVING را ترکیب کرد یا چند شرط را توسط عملگرهای منطقی مانند AND و OR به هم وصل کرد:

SELECT Region, AVG(Amount) AS AverageSale, COUNT(*) AS CountSale

FROM Sales

GROUP BY Region

HAVING AVG(Amount) > 500 AND COUNT(*) > 20;

نکات مهم

  • دستور HAVING فقط با ستون‌ها یا توابع تجمیعی یا عباراتی که در SELECT و GROUP BY استفاده شده‌اند به درستی کار می‌کند.
  • استفاده از HAVING بدون GROUP BY قانونی نیست، چرا که HAVING متعلق به نتایج گروه‌بندی است.

جمع‌بندی

دستور HAVING ابزاری مهم و ضروری برای فیلتر کردن گروه‌ها در پرس‌وجوهای تجمیعی SQL Server است که به شما امکان ایجاد محدودیت‌های پیچیده و دقیق روی داده‌های گروه‌بندی شده را می‌دهد و کاربرد گسترده‌ای در گزارشات و تحلیل‌های داده‌ای دارد.