گروه بندی داده Transact-SQL GROUP BY. دستور SELECT بخش GROUP BY گروه را با مثال انتخاب کنید

بند GROUP BY برای تعریف گروه‌هایی از ردیف‌های خروجی استفاده می‌شود که توابع انبوه (COUNT، MIN، MAX، AVG و SUM) را می‌توان اعمال کرد. اگر این بند وجود نداشته باشد و از توابع انبوه استفاده شود، تمام ستون‌های با نام ذکر شده در SELECT باید در توابع انبوه گنجانده شوند و آن توابع برای کل مجموعه ردیف‌هایی که گزاره پرس و جو را برآورده می‌کنند اعمال می‌شوند. در غیر این صورت، تمام ستون های لیست SELECT که در توابع انبوه گنجانده نشده اند باید در عبارت GROUP BY مشخص شوند. در نتیجه، تمام ردیف های پرس و جو خروجی به گروه هایی تقسیم می شوند که با ترکیب مقادیر یکسانی در این ستون ها مشخص می شوند. پس از آن توابع مجموع برای هر گروه اعمال خواهد شد. باید در نظر داشت که برای GROUP BY همه مقادیر NULL برابر در نظر گرفته می شوند، یعنی هنگام گروه بندی توسط یک فیلد حاوی مقادیر NULL، همه این ردیف ها در یک گروه قرار می گیرند.

اگر یک بند GROUP BY وجود داشته باشد و هیچ توابع جمعی در عبارت SELECT وجود نداشته باشد، آن پرس و جو به سادگی یک ردیف از هر گروه را برمی گرداند. این ویژگی به همراه کلمه کلیدی DISTINCT می تواند برای حذف ردیف های تکراری در مجموعه نتایج استفاده شود.

بیایید به یک مثال ساده نگاه کنیم:

اجرا کنید

    مدل SELECT، COUNT (مدل) AS Qty_model،

    AVG (قیمت) AS Avg_price

    از کامپیوتر

    GROUP BY مدل;

SELECT model, COUNT(model) AS Qty_model, AVG(price) AS Avg_price FROM PC GROUP BY مدل;


در این درخواست برای هر مدل PC تعداد و میانگین هزینه آنها مشخص می شود. همه سطرهایی با مقدار مدل یکسان یک گروه را تشکیل می دهند و خروجی SELECT تعداد مقادیر و میانگین قیمت هر گروه را محاسبه می کند. نتیجه پرس و جو جدول زیر خواهد بود

مدل Qty_model میانگین_قیمت
1121 3 850
1232 4 425
1233 3 843,333333333333
1260 1 350

اگر SELECT دارای ستون تاریخ باشد، محاسبه این شاخص ها برای هر تاریخ خاص امکان پذیر است. برای انجام این کار، باید تاریخ را به عنوان یک ستون گروه بندی اضافه کنید، و سپس توابع جمع برای هر ترکیبی از مقادیر (مدل، تاریخ) محاسبه می شود.

چندین قانون خاص برای انجام توابع کل وجود دارد.

  • اگر پرس و جو یک سطر (یا یک ردیف برای یک گروه معین) را برنگرداند، در این صورت هیچ داده منبعی برای محاسبه هیچ یک از توابع جمع وجود ندارد. در این حالت، نتیجه COUNT توابع صفر و نتیجه همه توابع دیگر NULL خواهد بود.
    این ویژگی ممکن است همیشه نتیجه واضحی به همراه نداشته باشد. به عنوان مثال، این پرس و جو را در نظر بگیرید:
    اجرا کنید

      وجود دارد (انتخاب حداکثر (قیمت)

      از کامپیوتر


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

  • یک آرگومان به یک تابع مجموع به خودی خود نمی تواند شامل توابع انبوه (تابع تابع) باشد. یعنی در درخواست ساده(بدون پرس و جو) نمی توانید مثلاً حداکثر مقادیر متوسط ​​را بدست آورید.
  • نتیجه تابع COUNT یک عدد صحیح (INTEGER) است. سایر توابع انبوه، انواع داده‌های مقادیری را که پردازش می‌کنند به ارث می‌برند.
  • اگر تابع SUM نتیجه ای بیش از حداکثر تولید کند معنی ممکنبرای نوع داده استفاده شده، خطایی رخ می دهد.
  • بنابراین، توابع انبوه موجود در بند SELECT یک پرس و جو که شامل بند GROUP BY نیست در تمام ردیف های حاصل از آن کوئری اجرا می شود. اگر درخواست شامل پیشنهاد گروهی BY، هر مجموعه از سطرهایی که دارای مقادیر یکسانی از ستون یا گروه ستون‌های مشخص شده در بند GROUP BY هستند، یک گروه را تشکیل می‌دهند و توابع انبوه بر روی هر گروه به طور جداگانه انجام می‌شوند.

یکی از تیم های مهم در SQL GROUP BY است. این ساختار برای انتخاب گروه های جداگانه ای از ردیف ها از یک جدول طراحی شده است که برای هر کدام از آنها توابع مشخص شده در آن مشخص شده است انتخاب کنید(مثلاً COUNT(), MIN()و غیره). بیایید به نمونه های خاص نگاه کنیم.

فرض کنید جدولی از سوپرمارکت ها داریم:

ما باید میانگین قیمت شیر ​​در هر سوپرمارکت را دریابیم. توجه داشته باشید که shop_idممکن است تکرار شود (پس از همه، سوپرمارکت های زنجیره ای وجود دارد). بنابراین، ما باید یک گروه را بر اساس shop_idو برای هر ردیف در این گروه میانگین قیمت را محاسبه کنید.

جدول اصلی به شکل زیر است:

بنابراین، ما میانگین قیمت را در یک سوپرمارکت زنجیره ای خاص (یا در یک فروشگاه) دریافتیم.

یکی دیگر از کاربردهای بسیار رایج، بازیابی رکوردهای منحصر به فرد از جداول است. در مثال قبلی متوجه شدید که در نمونه به دست آمده هیچ مورد تکراری وجود ندارد shop_id، در حالی که در جدول اصلی بودند.

فرض کنید یک جدول با کاربران داریم:

  • شناسه- شناسه منحصر به فرد
  • ایمیل - ایمیلکاربر.
  • هش- هش کاربر منحصر به فرد

و ما با وظیفه انتخاب روبرو بودیم کاربران منحصر به فرد، و به طور خاص افراد منحصر به فرد، نه منحصر به فرد حساب ها. بالاخره یک نفر می تواند داشته باشد 100 حساب های مختلف ایمیلو البته شناسه. الف هش- این خط خاصی است که او را به عنوان یک فرد منحصر به فرد مشخص می کند.

پس باید انتخاب کنیم همه رکوردها با هش منحصر به فرد. برای این دوباره استفاده می شود گروه توسط:

انتخاب * از گروه «جدول» بر اساس «هش».

در نتیجه، تنها موارد منحصر به فرد استخراج خواهند شد هش، یعنی 2 یکسان هشدر نمونه به دست آمده آن را نخواهید دید.

در اینجا دو عملی وجود دارد مثال استفاده از GROUP BY در SQLما آن را مرتب کردیم

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

SELECT PR, SUM(Qty) FROM Supplies GROUP BY PR;

نتیجه در شکل نشان داده شده است. 2.3، a.

الف)ب)V)ز)
روابط عمومی
9 0
11 150
12 30
15 370
1 370
3 250
5 170
6 220
8 150
7 200
2 0
4 100
13 190
14 70
16 250
17 50
10 220
PSروابط عمومیقیمتQ_vo
1 9 -0- -0-
3 9 -0- -0-
5 9 -0- -0-
1 11 1.50 50
5 11 -0- -0-
6 11 -0- -0-
8 11 1.00 100
1 12 3.00 10
3 12 2.50 20
6 12 -0- -0-
1 15 2.00 170
3 15 1.50 200
2 1 3.60 300
7 1 4.20 70
2 3 -0- -0-
7 3 4.00 250
. . .
روابط عمومی
1 370
2 0
3 250
4 100
5 170
6 220
7 200
8 150
9 0
10 220
11 150
12 30
13 190
14 70
15 370
16 250
17 50
روابط عمومی
9 0
11 150
12 30
15 70
1 370
3 250
5 70
6 140
8 150
7 200
2 0
4 100
13 190
14 70
16 250
17 50
10 220

برنج. 2.3. تصاویری برای عبارت GROUP BY

بند GROUP BY باعث می شود که جدول مشخص شده در FROM به گروه هایی بازآرایی شود که هر یک از آنها مقدار یکسانی در ستون مشخص شده در GROUP BY دارند. در مثال مورد بررسی، ردیف‌های جدول لوازم به‌گونه‌ای دسته‌بندی می‌شوند که یک گروه شامل تمام ردیف‌های یک محصول با PR = 1، گروه دیگر برای یک محصول با PR = 2 و غیره باشد. (شکل 2.3.b را ببینید). بعد، بند SELECT برای هر گروه اعمال می شود. هر عبارت در این عبارت باید یک معنی واحد برای گروه داشته باشد، یعنی. می‌تواند مقدار ستون مشخص‌شده در GROUP BY، یا یک عبارت حسابی شامل آن مقدار، یا یک ثابت یا یکی از توابع SQL باشد که روی تمام مقادیر یک ستون در یک گروه عمل می‌کند و آن‌ها را کاهش می‌دهد. مقادیر به یک مقدار واحد (به عنوان مثال، یک جمع) .

توجه داشته باشید که بند GROUP BY به معنای ORDER BY نیست. برای اطمینان از سفارش PR نتیجه مثال مورد بررسی (شکل 2.3، c)، باید یک درخواست ارائه شود.

SELECT PR, SUM(Qty) FROM Supplies GROUP BY PR ORDER BY PR;

در نهایت، توجه داشته باشید که سطرهای یک جدول را می توان با هر ترکیبی از ستون های آن گروه بندی کرد. بله در صورت درخواست

SELECT T, BL, COUNT(BL) FROM Order GROUP BY T, BL;

می توانید از کدها و تعداد وعده های غذایی سفارش داده شده توسط مهمانان پانسیون (32 نفر) برای هر یک از وعده های غذایی روز بعد مطلع شوید:

تیBLCOUNT (BL)
1 3 18
1 6 14
1 19 17
1 21 15
...

اگر یک پرس و جو از جمله های WHERE و GROUP BY استفاده کند، ردیف هایی که عبارت WHERE را برآورده نمی کنند، قبل از انجام گروه بندی حذف می شوند.

به عنوان مثال، برای هر محصول، کد آن و حجم کل لوازم احتمالی را با در نظر گرفتن ناتوانی موقت تامین کننده با PS = 2 صادر کنید:

SELECT PR, SUM(Qty) FROM Supplies WHERE PS 2 GROUP BY PR;

نتیجه نشان داده شده در شکل. 2.3d با نتیجه (شکل 2.3a) درخواست مشابه برای همه تامین کنندگان در حجم عرضه محصولات با کدهای 15، 5 و 6 متفاوت است.

آخرین به روز رسانی: 1396/07/19

T-SQL از دستورات GROUP BY و HAVING برای گروه بندی داده ها با استفاده از نحو رسمی زیر استفاده می کند:

ستون ها را از جدول انتخاب کنید

گروه توسط

بند GROUP BY نحوه گروه بندی ردیف ها را تعیین می کند.

به عنوان مثال، بیایید محصولات را بر اساس سازنده گروه بندی کنیم

SELECT سازنده، COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer

ستون اول در عبارت SELECT - Manufacturer نشان دهنده نام گروه است و ستون دوم - ModelsCount نتیجه تابع Count را نشان می دهد که تعداد ردیف های گروه را محاسبه می کند.

شایان توجه است که هر ستونی که در دستور SELECT استفاده می شود (بدون احتساب ستون هایی که نتیجه توابع جمع را ذخیره می کنند) باید بعد از عبارت GROUP BY مشخص شود. بنابراین، برای مثال، در مورد بالا، ستون Manufacturer در هر دو بند SELECT و GROUP BY مشخص شده است.

و اگر دستور SELECT روی یک یا چند ستون انتخاب می کند و همچنین از توابع جمع استفاده می کند، باید از عبارت GROUP BY استفاده کنید. بنابراین، مثال زیر کار نخواهد کرد زیرا حاوی عبارت گروه‌بندی نیست:

SELECT سازنده، COUNT(*) AS ModelsCount FROM Products

مثال دیگر، بیایید یک گروه بندی بر اساس تعداد محصولات اضافه کنیم:

SELECT سازنده، تعداد محصولات، COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer, ProductCount

بند GROUP BY می تواند توسط چندین ستون گروه بندی شود.

اگر ستونی که توسط آن گروه بندی انجام می شود دارای یک مقدار NULL باشد، سطرهایی با مقدار NULLیک گروه جداگانه تشکیل خواهد داد.

توجه داشته باشید که بند GROUP BY باید بعد از بند WHERE باشد اما قبل از بند ORDER BY:

SELECT سازنده، COUNT(*) به عنوان مدل شمارش از محصولات WHERE قیمت > 30000 GROUP BY سازنده سفارش بر اساس مدل تعداد DESC

فیلتر گروهی داشتن

اپراتور داشتن تعیین می کند که کدام گروه ها در نتیجه خروجی قرار می گیرند، یعنی گروه ها را فیلتر می کند.

استفاده از HAVING از بسیاری جهات شبیه به استفاده از WHERE است. فقط WHERE برای فیلتر کردن ردیف ها استفاده می شود، HAVING برای فیلتر کردن گروه ها استفاده می شود.

به عنوان مثال، بیایید همه گروه های محصول را بر اساس سازنده که بیش از 1 مدل برای آنها تعریف شده است، پیدا کنیم:

SELECT سازنده، COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer HAVING COUNT(*) > 1

در این مورد، در یک دستور می توانیم از عبارات WHERE و HAVING استفاده کنیم:

SELECT سازنده، COUNT(*) AS ModelsCount FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING COUNT(*) > 1

یعنی در این حالت، ردیف‌ها ابتدا فیلتر می‌شوند: آن دسته از محصولاتی انتخاب می‌شوند که هزینه کل آنها بیش از 80000 باشد، سپس محصولات انتخاب شده بر اساس سازنده گروه‌بندی می‌شوند. و سپس خود گروه ها فیلتر می شوند - گروه هایی که بیش از 1 مدل دارند انتخاب می شوند.

اگر مرتب سازی لازم باشد، عبارت ORDER BY بعد از عبارت HAVING می آید:

SELECT سازنده، COUNT(*) AS Models, SUM(ProductCount) AS Units FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Units DESC

در این حالت گروه بندی بر اساس سازنده است و تعداد مدل های هر سازنده (Models) و تعداد کل محصولات برای همه این مدل ها (Units) نیز انتخاب می شود. در پایان، گروه ها بر اساس تعداد محصولات به ترتیب نزولی مرتب می شوند.

نام خانوادگی

سال تولد

ایوانوویچ

پتروویچ

میخائیلوویچ

بوریسوویچ

نیکولایونا

سیدوروا

کاترین

ایوانونا

ولنتاین

سرگیویچ

آناتولی

میخائیلوویچ

برنج. 4.20. استفاده از LIKE "^[D-M]%"

اکنون می توانید از نظر روابط SQL که به طور خاص تعریف شده اند، گزاره هایی ایجاد کنید. می‌توانید مقادیری را در یک محدوده خاص (BETWEEN) یا یک مجموعه عددی (IN) جستجو کنید، یا می‌توانید مقادیر کاراکتری را جستجو کنید که متن را با پارامترها مطابقت دارد (LIKE).

4.4. GROUP BY و توابع جمع SQL

نتیجه یک پرس و جو می تواند یک مقدار گروهی تعمیم یافته از فیلدها باشد، درست مانند مقدار یک فیلد واحد. این با استفاده از سنگدانه استاندارد انجام می شود توابع SQL، که لیستی از آنها در زیر آورده شده است:

به جز مورد خاص COUNT(*)، هر یک از این توابع بر روی مجموعه ای از مقادیر در یک ستون از جدول عمل می کنند و تنها یک مقدار تولید می کنند.

آرگومان تمام توابع به جز COUNT(*) ممکن است قبل از آن باشد کلمه کلیدی DISTINCT، نشان می دهد که مقادیر ستون های تکراری وجود دارد

قبل از اعمال تابع باید حذف شود. تابع ویژه COUNT(*) برای شمارش تمام ردیف های جدول بدون استثنا (از جمله موارد تکراری) استفاده می شود.

توابع جمع مانند نام فیلدها در یک عبارت استفاده می شوند پرس و جو را انتخاب کنید، اما با یک استثنا: آنها نام فیلدها را به عنوان آرگومان می گیرند. فقط فیلدهای عددی را می توان با SUM و AVG استفاده کرد.

هر دو فیلد عددی و کاراکتری را می توان با COUNT، MAX و MIN استفاده کرد. هنگامی که با فیلدهای کاراکتر استفاده می شود، MAX و MIN آنها را به یک کد ASCII معادل ترجمه می کنند، که باید به این معنی باشد که MIN به ترتیب حروف الفبا به معنای اولین و MAX آخرین مقدار خواهد بود.

برای یافتن مجموع همه حقوق در جدول DEPARTMENT_EMPLOYEE (شکل 2.3)، باید عبارت زیر را وارد کنید:

از طرف بخش_ کارمندان;

و در صفحه ما نتیجه را خواهیم دید: 46800 (جدول دارای یک ستون به نام SUM خواهد بود).

محاسبه میانگین ارزش حقوق نیز ساده است:

SELECT AVG ((حقوق))

از طرف بخش_ کارمندان;

تابع COUNT کمی با بقیه متفاوت است. او تعداد مقادیر را در آن می شمارد این ستونیا تعداد ردیف های جدول. هنگامی که مقادیر یک ستون را شمارش می کند، با DISTINCT برای شمارش تعداد مقادیر منحصر به فرد در یک فیلد مشخص استفاده می شود.

جدول دارای هشت ردیف است که شامل مقادیر مختلف حقوق است.

توجه داشته باشید که سه مثال آخر اطلاعات مربوط به کارمندان اخراج شده را نیز در نظر می گیرد.

جمله زیر به شما این امکان را می دهد که تعداد تقسیمات را تعیین کنید

DISTINCT پس از آن نام فیلدی که روی آن اعمال می شود، داخل پرانتز قرار می گیرد و COUNT برای ستون های جداگانه اعمال می شود.

انتخاب تعداد (*)

از طرف بخش_ کارمندان;

پاسخ این خواهد بود:

COUNT(*) هر سطر جدول را می شمارد.

DISTINCT با COUNT (*) قابل اجرا نیست.

بیایید فرض کنیم که جدول PAYMENT_STATE (شکل 2.4) یک ستون دیگر دارد که مقدار کسرهای انجام شده (فیلد کسر) را برای هر خط از بیانیه ذخیره می کند. سپس اگر به کل مبلغ علاقه دارید، باید محتویات ستون های مقدار و کسر را با هم جمع کنید.

اگر به حداکثر مبلغ، با در نظر گرفتن کسورات، موجود در بیانیه علاقه مند هستید، این کار را می توان با استفاده از جمله زیر انجام داد:

SELECT MAX (جمع + کسر)

FROM Pay_sheet;

برای هر ردیف از جدول، این پرس و جو مقدار فیلد Amount را با مقدار فیلد Deduction اضافه می کند و بیشترین مقدار را انتخاب می کند. ارزش عالیکه او پیدا خواهد کرد.

گروه به بند (بازآرایی، سفارش)

عبارت GROUP BY به شما این امکان را می دهد که زیرمجموعه ای از مقادیر را در یک فیلد خاص بر حسب فیلد دیگر تعریف کنید و یک تابع جمع را به زیر مجموعه اعمال کنید. این امکان ترکیب فیلدها و توابع انباشته در یک عبارت SELECT را فراهم می کند.

برای مثال، فرض کنید می‌خواهید تعداد کارمندان هر بخش را تعیین کنید (پاسخ در شکل 4.21 نشان داده شده است):

SELECT Department_ID، COUNT (DISTINCT Department_ID) AS Number of_employees

بخش_ کارمندان

تاریخ اخراج

تعداد_کارمند

بند GROUP BY فقط مقادیر ستون منحصر به فرد را به جای می گذارد که به طور پیش فرض به ترتیب صعودی مرتب شده اند. در این جنبه، بند GROUP BY با بند ORDER BY متفاوت است، زیرا دومی، اگرچه رکوردها را به ترتیب صعودی مرتب می کند، اما مقادیر تکراری را حذف نمی کند. در مثال داده شده، پرس و جو ردیف های جدول را بر اساس مقادیر ستون Dept_ID (بر اساس شماره بخش) گروه بندی می کند. سطرهایی با شماره بخش یکسان ابتدا در گروه ها ترکیب می شوند، اما برای هر گروه فقط یک ردیف نمایش داده می شود. ستون دوم تعداد سطرهای هر گروه را نشان می دهد. تعداد کارکنان در هر بخش

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

برای مثال، اجازه دهید جدول PAYMENT_LIST مانند شکل باشد. 4.22 و ما می خواهیم حداکثر مبلغ پرداختی در لیست حقوق به هر کارمند را تعیین کنیم.

نوع پرداخت

در نتیجه بدست می آوریم.

برنج. 4.23. عملکرد جمع با AS

گروه بندی را می توان با چندین ویژگی انجام داد:

FROM Sheet1

GROUP BY Employee_id, Date;

نتیجه:

برنج. 4.24. گروه بندی بر اساس چندین ویژگی

اگر نیاز به محدود کردن تعداد گروه های بدست آمده پس از GROUP BY وجود دارد، با استفاده از عبارت HAVING می توانید این کار را اجرا کنید.

4.5. با استفاده از عبارت HAVING

عبارت HAVING همان نقشی را برای گروه ها ایفا می کند که عبارت WHERE برای ردیف ها انجام می دهد: برای حذف گروه ها استفاده می شود، همانطور که WHERE برای حذف ردیف ها استفاده می شود. این عبارت در جمله گنجانده شده است

فقط در صورتی که یک بند GROUP BY وجود داشته باشد و عبارت HAVING باید یک مقدار واحد برای گروه داشته باشد.

برای مثال، فرض کنید باید ترکیب کمی همه بخش ها را نشان دهیم (شکل 2.3)، به استثنای بخش شماره 3.

SELECT Department_ID، COUNT (DISTINCT Department_ID) AS تعداد _employees

بخش_ کارمندان

تاریخ اخراج

دارای ID_Department< > 3;

تعداد_کارمند

آخرین عنصر هنگام ارزیابی عبارت جدول، بخش HAVING (در صورت وجود) است. سینتکس این بخش به شرح زیر است:

::=

داشتن

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

شرط جستجوی عبارت HAVING از قوانین نحوی مشابه شرط جستجوی عبارت WHERE پیروی می‌کند و می‌تواند شامل محمول‌های مشابه باشد.

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

بنابراین، فقط مشخصات ستون‌هایی که به عنوان ستون‌های گروه‌بندی در عبارت GROUP BY مشخص شده‌اند، می‌توانند مستقیماً در عبارات حسابی محمول موجود در بند انتخاب عبارت HAVING استفاده شوند. ستون‌های باقی‌مانده را فقط می‌توان در مشخصات توابع مجموع COUNT، SUM، AVG، MIN و MAX مشخص کرد که در این مورد مقداری را محاسبه می‌کنند. ارزش کلبرای کل گروه ردیف ها وضعیت در مورد سؤالات فرعی موجود در محمولات شرط انتخاب بخش HAVING مشابه است: اگر سؤال فرعی از مشخصه گروه فعلی استفاده می کند، تنها با مراجعه به ستون های گروه بندی می توان آن را مشخص کرد.

اجازه دهید درخواست به شکل باشد (برای جدول پایه، به شکل 4.22 مراجعه کنید):

SELECT Employee_id، تاریخ، MAX ((مبلغ))

FROM Sheet1

GROUP BY Employee_id, Date;

لازم به توضیح است تا فقط پرداخت های بیش از 1000 نشان داده شود.

با این حال، طبق استاندارد، استفاده از یک تابع جمع در یک عبارت WHERE غیرقانونی است (مگر اینکه از یک پرس و جوی فرعی استفاده کنید، که در ادامه توضیح داده شد)، زیرا محمول ها بر حسب یک ردیف ارزیابی می شوند، و توابع جمع بر حسب گروهی از ردیف ها ارزیابی می شوند. .

جمله زیر نادرست خواهد بود:

SELECT ID_id، تاریخ، MAX (مقدار)

FROM Sheet1

WHERE MAX ((جمع)) > 1000 GROUP BY Comp_Id, Date;

جمله صحیح این خواهد بود:

SELECT Employee_id، تاریخ، MAX ((مبلغ))