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 | ساخت گروه |
| HAVING | Filter گروه |
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 سه معیار ثابت برای ارزیابی نمونهها هستند.