توابع جمعی / توابع گروهی
توابع جمع در واقع توابع داخلی در SQL هستند. آنها برای نوعی از عملیات خاص استفاده می شوند، مانند محاسبه میانگین اعداد، تعداد کل رکوردها، مجموع مجموع اعداد و غیره. به عنوان مثال - اگر میخواهید حداکثر حقوق را در بین سوابق مختلف محاسبه کنید، بدیهی است که بیش از 1 سابقه وجود خواهد داشت که حداکثر حقوق را از آنها پیدا میکنید. به طور مشابه، اگر میخواهید مجموع حقوق را محاسبه کنید، مجموعهای از حقوق خواهید داشت که در آن این تابع را برای دریافت خروجی اعمال خواهید کرد.
نمونه ای از توابع جمع در زیر آورده شده است.
- Sum(), Min(), Max(), Count(), Avg()
- SELECT COUNT(*) AS InvoiceCount
- , SUM(Total) AS TotalAllInvoices
- , AVG(Total) AS AverageTotal
- , MAX(Total) AS MaxInvoices
- , MIN(Total) AS MinInvoices
- FROM Invoice
- WHERE BillingCountry = 'USA'
اجازه دهید به شما بگویم که این پرس و جو چگونه کار می کند. اول از همه، موتور SQL رکورد را از جدول فاکتور بر اساس بند WHERE استخراج می کند و سپس، این توابع GROUP بالا برای گروه رکوردهای استخراج شده اعمال می شود. در اینجا، پس از اعمال توابع گروه در جدول کامل فیلتر شده، نتایج را دریافت می کنیم.
حال، فرض کنید میخواهیم نتایج برخی از گروههای رکوردهای یک رابطه (چه فیلتر شده یا غیر فیلتر شده) را به دست آوریم. بنابراین، ما از بند GROUP BY در SQL استفاده می کنیم.
- SELECT COUNT(*) as Records
- FROM Invoice
- WHERE Total > 2
- GROUP BY BillingCountry
در این جستجو، تعداد کل رکوردها را بر اساس مقادیر مشخصه BillingCountry دریافت می کنیم. و وقتی این پرس و جو را اجرا کنیم، این نتیجه را خواهیم گرفت.
![گروه با داشتن توابع مجموع](http://pezhvak24.ir/dl/10kcor/cscd/article/group-by-having-aggregate-functions/Images/Group By Having Aggregate Functions01.png)
همانطور که می بینید، ما نمی توانیم نتیجه را فقط با مقادیر خروجی درک کنیم، بنابراین بهترین روش این است که ویژگی را بر اساس آنچه دریافت می کنیم چاپ کنیم تا نتیجه را معنی دارتر کنیم.
- SELECT BillingCountry, COUNT(*) as Records
- FROM Invoice
- WHERE Total > 2
- GROUP BY BillingCountry
و با کمک این پرس و جو، به نتیجه ای خواهیم رسید.
![گروه با داشتن توابع مجموع](http://pezhvak24.ir/dl/10kcor/cscd/article/group-by-having-aggregate-functions/Images/Group%20By%20Having%20Aggregate%20Functions02.png)
حالا بیایید یک مثال دیگر را ببینیم.
- SELECT CustomerId
- , AVG(Total)
- FROM Invoice
- GROUP BY CustomerId
نگاه کنید، ما ویژگی های Non-Aggregated را با GROUP BY قرار می دهیم. اکنون، وقتی این کوئری اجرا می شود، همان تعداد شناسه مشتری را جمع آوری می کند و سپس میانگین تمام مقادیر ستون شناسه مشتری 2 را در جدول فاکتور می گیرد. اینجوری کار میکند.
حال، فرض کنید نام ویژگی دیگری در اسکریپت داریم.
- SELECT CustomerId
- , InvoiceDate
- , AVG(Total)
- FROM Invoice
- GROUP BY CustomerId
هنگامی که این عبارت را اجرا می کنید، این خطا را در پنجره پیام ها مشاهده خواهید کرد که می گوید - "ستون "Invoice.InvoiceDate" در لیست انتخاب نامعتبر است زیرا در یک تابع تجمیع یا در بند GROUP BY وجود ندارد.
![گروه با داشتن توابع مجموع](http://pezhvak24.ir/dl/10kcor/cscd/article/group-by-having-aggregate-functions/Images/Group%20By%20Having%20Aggregate%20Functions03.png)
از آنجا که Avg () یک تابع جمع است که در مجموعه اعمال می شود و InvoiceDate یک فیلد DateTime است که مقدار آن همیشه متفاوت است، بنابراین اگر فقط Group By را در CustomerID اعمال کرده باشیم، کافی نیست زیرا باید InvoiceDate را نیز پوشش دهیم. . بنابراین،
- SELECT CustomerId
- , InvoiceDate
- , AVG(Total)
- FROM Invoice
- -- Just for better understandability
- WHERE CustomerId = 2
- GROUP BY CustomerId, InvoiceDate
ببین چی میگیریم
![گروه با داشتن توابع مجموع](http://pezhvak24.ir/dl/10kcor/cscd/article/group-by-having-aggregate-functions/Images/Group%20By%20Having%20Aggregate%20Functions04.png)
قبل از InvoiceDate، ما فقط 1 رکورد از CustomerId 2 دریافت می کردیم زیرا 2 مقدار گسسته است. و پس از قرار دادن InvoiceDate در پرس و جو، تقریباً تمام رکوردها را دریافت می کنیم زیرا پیوسته است. فقط زمانی که مقدار InvoiceDate با هر رکورد دیگری از InvoiceDate مطابقت داشته باشد، از آن رکورد InvoiceDate صرفنظر می شود، به علاوه هر دو رکورد حاوی CustomerId 2 هستند. و ما مقدار میانگین همه آن رکوردهای منطبق را دریافت می کنیم.
بیایید یک مثال دیگر را ببینیم.
- SELECT BillingCountry, BillingCity, COUNT(*) as Records
- FROM Invoice
- WHERE Total > 2
- GROUP BY BillingCountry, BillingCity
- ORDER BY BillingCountry