فصل 13 از 24 درس 1 از 1

Aggregate Functions و GROUP BY

Aggregate Functions و GROUP BY

بخشی از آموزش جامع SQL Server

محتوای درس Aggregate Functions و GROUP BY

T-SQL | COUNT، SUM، AVG و HAVING

Aggregate چند Row را به مقادیر خلاصه تبدیل می‌کند. GROUP BY مرز گروه‌ها را مشخص و HAVING گروه‌های نهایی را Filter می‌کند.

متن این فصل با رویکرد مرجع فنی و قابل استفاده در پروژه واقعی تنظیم شده است؛ مثال‌ها در امتداد مدل StoreDb نوشته شده‌اند و اصطلاحات اصلی SQL Server و T-SQL به‌صورت یکدست به‌کار می‌روند.

1. مفاهیم و قراردادهای اصلی

Aggregate چند Row را به مقادیر خلاصه تبدیل می‌کند. GROUP BY مرز گروه‌ها را مشخص و HAVING گروه‌های نهایی را Filter می‌کند.

در طراحی پایگاه داده، Syntax تنها بخشی از مسئله است. نوع داده، Constraint، الگوی دسترسی، Transaction و هزینه اجرای Query باید هم‌زمان با نیاز Domain در نظر گرفته شوند.

مفهومکارکرد
COUNTشمارش
SUMمجموع
AVGمیانگین
MIN/MAXکمینه/بیشینه
GROUP BYساخت گروه
HAVINGFilter گروه

2. ساختار و Syntax پایه

Columnهای غیر Aggregate در SELECT باید بخشی از Grouping باشند. WHERE پیش از Grouping و HAVING پس از Aggregate اعمال می‌شود.

SELECT
    CustomerId,
    COUNT(*) AS OrderCount,
    SUM(TotalAmount) AS TotalSales,
    AVG(TotalAmount) AS AverageOrderValue
FROM dbo.Orders
GROUP BY CustomerId;

3. سناریوی StoreDb

برای یافتن مشتریان با حداقل سه سفارش پرداخت‌شده، ابتدا WHERE وضعیت را Filter و سپس HAVING تعداد Group را محدود می‌کند.

نمونه‌های این فصل بر مدل فروشگاهی StoreDb بنا شده‌اند تا ارتباط مفاهیم میان فصل‌ها حفظ شود و Queryها در یک Context یکپارچه قابل بررسی باشند.

SELECT
    CustomerId,
    COUNT(*) AS PaidOrderCount,
    SUM(TotalAmount) AS PaidTotal
FROM dbo.Orders
WHERE Status = N'Paid'
GROUP BY CustomerId
HAVING COUNT(*) >= 3;

4. اصول طراحی و Performance

طراحی پایدار باید هم صحت داده و هم هزینه اجرای عملیات را پوشش دهد. انتخاب ساده‌تر زمانی ترجیح دارد که Contract داده را روشن‌تر و رفتار Optimizer را قابل پیش‌بینی‌تر نگه دارد.

  • Aggregate هر Child پیش از Join پیچیده قابل بررسی است.
  • NULL در COUNT(*) و COUNT(Column) تفاوت دارد.
  • Data Type خروجی SUM برای مقادیر بزرگ بررسی شود.
  • Grouping مطابق نیاز گزارش باشد.

5. خطاهای رایج و نکات ایمنی

دستورهای SQL می‌توانند مستقیماً داده و ساختار را تغییر دهند؛ بنابراین بازبینی Context، تعداد Rowهای هدف و اثر Transaction قبل از اجرای تغییرات اهمیت عملی دارد.

  • انتخاب Column غیر Aggregate خارج از GROUP BY.
  • Join دو Collection و دوبرابر شدن Aggregate.
  • استفاده از HAVING به‌جای WHERE برای Row Filter ساده.
  • فرض صفر به‌جای NULL برای SUM مجموعه خالی.

6. چک‌لیست نهایی فصل

  • WHERE و HAVING درست تفکیک شده‌اند.
  • Grouping Keyها دقیق‌اند.
  • Aggregate در Joinهای پیچیده Duplicate تولید نمی‌کند.
  • NULL Behavior شناخته شده است.

7. جمع‌بندی

خروجی این فصل باید به تصمیمی قابل اتکا در طراحی یا Query منجر شود؛ صحت داده، قابلیت نگهداری و رفتار Performance سه معیار ثابت برای ارزیابی نمونه‌ها هستند.