Компютри Windows интернет

Sql заявките се групират по. Transact-SQL групиране на данни GROUP BY. Групиране чрез групиране по и филтриране на групи с наличие

Групирането на данни ви позволява да разделите всички данни на логически набори, което прави възможно извършването на статистически изчисления отделно във всяка група.

1. Създаване на групи (GROUP BY)

Групите се създават с помощта на предложение ГРУПИРАЙ ПОоператор ИЗБЕРЕТЕ. Нека разгледаме един пример.

ИЗБЕРЕТЕ Продукт, SUM(Количество) AS Product_num FROM Sumproduct GROUP BY Product

С тази заявка извлякохме информация за броя на продадените продукти през всеки месец. Оператор ИЗБЕРЕТЕкомандва две колони да бъдат изведени Продукт- име на продукта и Product_num- поле за изчисление, което създадохме за показване на количеството продадени продукти (формула на полето SUM (Количество)). Оферта ГРУПИРАЙ ПОказва на СУБД да групира данните по колони Продукт. Също така си струва да се отбележи, че ГРУПИРАЙ ПОтрябва да идва след изречението КЪДЕТОи преди ПОДРЕДЕНИ ПО.

2. Филтриране на групи (HAVING)

Точно както филтрирахме редове в таблица, можем да филтрираме групирани данни. За да направите това в SQLима оператор ИМАЩ. Нека вземем предишния пример и добавим филтриране по групи.

ИЗБЕРЕТЕ Продукт, SUM(Количество) AS Product_num FROM Sumproduct ГРУПА ПО Продукт HAVING SUM(Количество)>4000

Виждаме, че след като количеството продадени стоки е изчислено за всеки продукт, СУБД „отрязва“ тези продукти, от които са продадени по-малко от 4000 единици.

Както виждаме, операторът ИМАЩмного подобен на оператора КЪДЕТО, обаче, те имат значителна разлика помежду си: КЪДЕТОфилтрира данните, преди да бъдат групирани, и ИМАЩ- извършва филтриране след групиране. Така че редовете, които бяха премахнати от предложението КЪДЕТОНЯМА да се включва в групата. И така, операторите КЪДЕТОИ ИМАЩможе да се използва в същото изречение. Да разгледаме един пример:

ИЗБЕРЕТЕ Продукт, SUM(Количество) AS Product_num FROM Sumproduct WHERE Продукт<>"Ски Дълги" ГРУПИРАНЕ ПО ПРОДУКТ С СУМА(КОЛИЧЕСТВО)>4000

Добавихме оператора към предишния пример КЪДЕТОкъдето е посочен продуктът Дълги ски, което от своя страна повлия на групирането от оператора ИМАЩ. В резултат на това виждаме, че продуктът Дълги скине е включен в списъка на групите с брой продадени продукти над 4000 бр.

3. Групиране и сортиране

Както при нормалното извличане на данни, можем да сортираме групи след групиране с оператора ИМАЩ. За да направим това, можем да използваме оператора, с който вече сме запознати ПОДРЕДЕНИ ПО. В тази ситуация приложението му е подобно на предишните примери. например:

ИЗБЕРЕТЕ Продукт, SUM(Количество) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>3000 ORDER BY SUM(Quantity)

или просто посочете номера на полето в реда, по който искаме да сортираме:

ИЗБЕРЕТЕ Продукт, SUM(Количество) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>3000 ORDER BY 2

Виждаме, че за да сортираме обобщените резултати, просто трябва да напишем изречения с ПОДРЕДЕНИ ПОслед оператора ИМАЩ. Има обаче едно предупреждение. Достъп до СУБДне поддържа сортиране на групи по псевдоними на колони, тоест в нашия пример, за да сортираме стойностите, няма да можем да пишем в края на заявката ПОРЪЧАЙТЕ ПО Product_num.

В тази статия ще ви разкажа как се групират данните, как правилно да използвате групиране по и вътре в SQL заявки, използвайки примера на няколко заявки.

По-голямата част от информацията в базите данни се съхранява в подробна форма. Често обаче има нужда от получаване на отчети. Например, разберете общия брой потребителски коментари или може би количеството стоки в складовете. Има много подобни задачи. Следователно, езикът SQL специално предвижда за такива случаи групирането чрез и притежаващи конструкции, които позволяват съответно групиране и филтриране на получените групи от данни.

Използването им обаче причинява много проблеми на начинаещите автори на софтуерни творения. Те не съвсем правилно интерпретират получените резултати и самия механизъм за групиране на данни. Затова нека да разберем на практика какво се случва и как.

Като част от примера ще разгледам само една таблица. Причината е проста, тези оператори вече са приложени към получената извадка от данни (след комбиниране на редовете на таблицата и филтрирането им). Така че добавянето на оператори where и join няма да промени същността.

Нека си представим абстрактен пример. Да приемем, че имате обобщена таблица на потребителите на форума. Нека го наречем userstat и изглежда така. Важен момент, ние вярваме, че един потребител може да принадлежи само към една група.

user_name - потребителско име

forum_group - име на групата

mess_count - брой съобщения

is_have_social_profile - дали профилът във форума съдържа линк към страница в социална мрежа

Както можете да видите, таблицата е проста и можете сами да изчислите много неща с помощта на калкулатор. Това обаче е само пример и има само 10 записа. В реалните бази данни записите могат да се измерват в хиляди. И така, нека започнем със запитванията.

Чисто групиране чрез групиране по

Нека си представим, че трябва да знаем стойността на всяка група, а именно средната оценка на потребителите в групата и общия брой оставени съобщения във форума.

Първо, кратко словесно описание, за да улесните разбирането на SQL заявката. Така че трябва да намерите изчислените стойности по форумни групи. Съответно, трябва да разделите всички тези десет реда на три различни групи: администратор, модер, потребител. За да направите това, трябва да добавите групиране по стойностите на полето forum_group в края на заявката. И също така добавете изчислени изрази за избор с помощта на така наречените агрегатни функции.

Посочете полета и изчислени колони изберете forum_group, avg(raiting) като avg_raiting, sum(mess_count) като total_mess_count -- Посочете таблицата от userstat -- Посочете групиране по поле група по forum_group

Моля, обърнете внимание, че след като сте използвали конструкцията group by в заявка, можете да използвате само онези полета в select, които са посочени след group by, без да използвате агрегатни функции. Останалите полета трябва да бъдат посочени вътре в агрегатните функции.

Използвах и две агрегатни функции. AVG - изчислява средната стойност. И SUM - изчислява сумата.

форум_групасреден_рейтингtotal_mess_count
администратор 4 50
модер 3 50
потребител 3 150

1. Първо, всички редове на изходната таблица бяха разделени на три групи според стойностите на полето forum_group. Например, имаше трима потребители в групата администратори. Има и 3 реда вътре в модера. И вътре в потребителската група имаше 4 реда (четирима потребители).

2. След това към всяка група бяха приложени агрегатни функции. Например, за групата администратор средната оценка е изчислена както следва (2 + 5 + 5)/3 = 4. Броят на съобщенията е изчислен като (10 + 15 + 25) = 50.

Както можете да видите, нищо сложно. Приложихме обаче само едно условие за групиране и не филтрирахме по група. Така че нека преминем към следващия пример.

Групиране чрез групиране по и филтриране на групи с наличие

Сега нека разгледаме по-сложен пример за групиране на данни. Да кажем, че трябва да оценим ефективността на действията за привличане на потребителите към социални дейности. Казано по-просто, разберете колко потребители в групи са оставили връзки към своите профили и колко игнорирани имейли и т.н. В реалния живот обаче може да има много такива групи, така че трябва да филтрираме онези групи, които могат да бъдат пренебрегнати (например твърде малко хора не са оставили връзка; защо да претрупваме пълния отчет). В моя пример това са групи само с един потребител.

Първо ще опишем устно какво трябва да се направи в SQL заявката. Трябва да разделим всички редове на оригиналната таблица userstat според следните критерии: име на група и наличие на социален профил. Съответно е необходимо данните от таблицата да се групират по полетата forum_group и is_have_social_profile. Ние обаче не се интересуваме от онези групи, в които има само един човек. Следователно такива групи трябва да бъдат филтрирани.

Забележка: Струва си да знаете, че този проблем може да бъде решен чрез групиране само по едно поле. Ако използвате конструкцията case. В рамките на този пример обаче са показани възможностите за групиране.

Бих искал също незабавно да изясня един важен момент. Можете да филтрирате само като използвате, когато използвате агрегатни функции, а не по отделни полета. С други думи, това не е конструкция where, това е филтър за групи от редове, а не за отделни записи. Въпреки че условията вътре са посочени по подобен начин с помощта на "или" и "и".

Ето как би изглеждала SQL заявката

Посочете полета и изчислени колони изберете forum_group, is_have_social_profile, count(*) като общ -- Посочете таблицата от userstat -- Посочете групиране по полета група по forum_group, is_have_social_profile -- Посочете груповия филтър с count(*) > 1

Моля, имайте предвид, че полетата след конструкцията group by са разделени със запетаи. Указването на полета в select става по същия начин, както в предишния пример. Използвах и агрегатната функция count, която изчислява броя на редовете в групите.

Ето резултата:

форум_групае_има_социален_профилобща сума
администратор 1 2
модер 1 2
потребител 0 3

Нека да разгледаме стъпка по стъпка как се получи този резултат.

1. Първоначално се получават 6 групи. Всяка от групите forum_group беше разделена на две подгрупи въз основа на стойностите на полето is_have_social_profile. С други думи, групи: , , , , , .

Забележка: Между другото, не е задължително да има групи 6. Така че, например, ако всички администратори са попълнили профил, тогава ще има 5 групи, тъй като полето is_have_social_profile ще има само една стойност за потребителите на администраторската група.

2. След това условието на филтъра за наличие беше приложено към всяка група. Поради това бяха изключени следните групи: , , . Тъй като във всяка такава група имаше само един ред от изходната таблица.

3. След това се изчисляват необходимите данни и се получава резултатът.

Както можете да видите, няма нищо трудно за използване.

Струва си да знаете, че в зависимост от базата данни, възможностите на тези конструкции може да се различават. Например може да има повече агрегатни функции или можете да зададете изчисляеми колони вместо отделни полета като групиране. Тази информация вече трябва да бъде разгледана в спецификацията.

Сега знаете как да групирате данни с групиране по, както и как да филтрирате групи с помощта на притежаване.


Последна актуализация: 19.07.2017

T-SQL използва операторите GROUP BY и HAVING за групиране на данни, използвайки следния формален синтаксис:

ИЗБЕРЕТЕ колони ОТ таблицата

ГРУПИРАЙ ПО

Клаузата GROUP BY определя как ще бъдат групирани редовете.

Например, нека групираме продуктите по производител

ИЗБЕРЕТЕ Производител, БРОЙ(*) КАТО МоделиБрой ОТ Продукти, ГРУПИРАНИ ПО Производител

Първата колона в оператора SELECT - Manufacturer представлява името на групата, а втората колона - ModelsCount представя резултата от функцията Count, която изчислява броя на редовете в групата.

Струва си да се има предвид, че всяка колона, която се използва в оператор SELECT (без да се броят колоните, които съхраняват резултата от агрегатни функции), трябва да бъде указана след клаузата GROUP BY. Така, например, в горния случай колоната Manufacturer е посочена и в клаузите SELECT и GROUP BY.

И ако операторът SELECT избира една или повече колони и също така използва агрегатни функции, тогава трябва да използвате клаузата GROUP BY. По този начин следният пример няма да работи, защото не съдържа израз за групиране:

ИЗБЕРЕТЕ Производител, БРОЙ(*) КАТО МоделиБрой ОТ Продукти

Друг пример, нека добавим групиране по брой продукти:

ИЗБЕРЕТЕ Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer, ProductCount

Клаузата GROUP BY може да се групира в множество колони.

Ако колоната, по която групирате, съдържа NULL стойност, редовете с NULL стойност ще образуват отделна група.

Имайте предвид, че клаузата GROUP BY трябва да идва след клаузата WHERE, но преди клаузата ORDER BY:

ИЗБЕРЕТЕ Производител, БРОЙ(*) КАТО Брой модели ОТ Продукти WHERE Цена > 30000 ГРУПИРАНЕ ПО Производител ORDER BY Брой модели DESC

Групово филтриране. ИМАЩ

Оператор ИМАЩ определя кои групи ще бъдат включени в изходния резултат, тоест филтрира групите.

Използването на HAVING е в много отношения подобно на използването на WHERE. Само WHERE се използва за филтриране на редове, HAVING се използва за филтриране на групи.

Например, нека намерим всички продуктови групи по производител, за които е дефиниран повече от 1 модел:

ИЗБЕРЕТЕ Производител, БРОЯ (*) КАТО Брой модели ОТ ГРУПИРАНЕ НА ПРОДУКТИ ПО Производител ИМАЩ БРОЯ (*) > 1

В този случай в една команда можем да използваме WHERE и HAVING изрази:

ИЗБЕРЕТЕ производител, БРОЙ(*) КАТО ModelsCount FROM Продукти WHERE Цена * Продуктов брой > 80000 ГРУПИРАНЕ ПО производител HAVING COUNT(*) > 1

Тоест в този случай първо се филтрират редовете: избират се онези продукти, чиято обща цена е над 80 000. След това избраните продукти се групират по производител. След това се филтрират самите групи - избират се тези групи, които съдържат повече от 1 модел.

Ако е необходимо сортиране, тогава изразът ORDER BY идва след израза HAVING:

ИЗБЕРЕТЕ Производител, БРОЙ(*) AS модели, SUM(ProductCount) AS Units FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Units DESC

В този случай групирането е по производител, като също така се избира броя на моделите за всеки производител (Models) и общия брой на всички продукти за всички тези модели (Units). Накрая групите се сортират по брой продукти в низходящ ред.

В този урок ще научите как да използвате SQL израза ГРУПИРАЙ ПОсъс синтаксис и примери.

Описание

Клаузата SQL GROUP BY може да се използва в оператор SELECT за събиране на данни в множество записи и групиране на резултатите в една или повече колони.

Синтаксис

Синтаксисът за оператора GROUP BY в SQL е:

Параметри или аргументи

израз1, израз2, … израз_n Изрази, които не са капсулирани в агрегатна функция и трябва да бъдат включени в GROUP BY в края на SQL заявката. aggregate_function Това е агрегатна функция като SUM, COUNT, MIN, MAX или AVG. aggregate_expression Това е колоната или изразът, за които ще се използва агрегатната_функция. таблици Таблиците, от които искате да извлечете записи. Клаузата FROM трябва да указва поне една таблица. Условия WHERE По избор. Това са условията, които трябва да бъдат изпълнени, за да изберете записи. ORDER BY израз По избор. Изразът, използван за сортиране на записите в резултатния набор. Ако е посочен повече от един израз, стойностите трябва да бъдат разделени със запетаи. ASC По избор. ASC сортира резултатния набор във възходящ ред по израз. Това е поведението по подразбиране, ако не е зададен модификатор. DESC По избор. DESC сортира резултатния набор в низходящ ред по израз.

Пример - Използване на GROUP BY с функцията SUM

Нека да видим как да използваме GROUP BY с функцията SUM в SQL.
В този пример имаме таблица на служителите със следните данни:

dept_id общи_заплати
500 119500
501 113000

В този пример използвахме функцията SUM, за да съберем всички заплати за всеки dept_id, и дадохме на резултата SUM(salary) псевдоним на „total_salaries“. Тъй като dept_id не е капсулиран във функцията SUM, той трябва да бъде посочен в клаузата GROUP BY.

Пример - Използване на GROUP BY с функцията COUNT

Нека да видим как да използваме клаузата GROUP BY с функцията COUNT в SQL.

В този пример имаме таблица с продукти със следните данни:

В този пример използвахме функцията COUNT, за да изчислим броя total_products за всеки category_id, и посочихме псевдонима „total_products“ като резултати от функцията COUNT. Изключихме всички стойности на category_id, които са NULL, като ги филтрирахме в клаузата WHERE. Тъй като category_id не е капсулиран във функцията COUNT, той трябва да бъде указан в клаузата GROUP BY.

Пример - Използване на GROUP BY с функцията MIN

Нека сега да видим как да използваме клаузата GROUP BY с функцията MIN в SQL.

В този пример отново ще използваме таблицата на служителите със следните данни:

Ще бъдат избрани 2 записа. Ето резултатите, които ще получите:

dept_id най-ниска_заплата
500 57500
501 42000

В този пример използвахме функцията MIN, за да върнем най-ниската стойност на заплатата за всеки dept_id, и използвахме псевдоним на резултатите от функцията MIN „lowest_salary“. Тъй като dept_id не е капсулиран във функцията MIN, той трябва да бъде посочен в клаузата GROUP BY.

Пример - Използване на GROUP BY с функцията MAX

И накрая, нека да разгледаме как да използваме клаузата GROUP BY с функцията MAX.

Нека отново използваме таблицата на служителите, но този път да намерим най-високата заплата за всеки dept_id:

номер_на_служител първо име фамилия заплата dept_id
1001 Джъстин Бийбър 62000 500
1002 Селена Гомес 57500 500
1003 Мила Кунис 71000 501
1004 Том Круиз 42000 501

Въведете следния SQL оператор.

Фамилия

Година на раждане

Иванович

Петрович

Михайлович

Борисович

Николаевна

Сидорова

Катрин

Ивановна

Валентин

Сергеевич

Анатолий

Михайлович

Ориз. 4.20. Използване на LIKE "^[D-M]%"

Вече можете да създавате предикати по отношение на специално дефинирани SQL релации. Можете да търсите стойности в конкретен диапазон (BETWEEN) или числов набор (IN), или можете да търсите стойности на знаци, които съответстват на текст в рамките на параметри (LIKE).

4.4. GROUP BY и SQL агрегатни функции

Резултатът от заявка може да бъде обобщена групова стойност от полета, точно като стойността на едно поле. Това се прави с помощта на стандартни SQL агрегатни функции, които са изброени по-долу:

С изключение на специалния случай COUNT(*), всяка от тези функции работи с колекция от стойности в колона на някаква таблица и произвежда само една стойност.

Аргументът на всички функции с изключение на COUNT(*) може да бъде предшестван от ключовата дума DISTINCT, което показва, че дублиращите се стойности на колони

трябва да бъдат изключени, преди функцията да може да бъде приложена. Специалната функция COUNT(*) се използва за преброяване на всички редове в таблицата без изключение (включително дубликати).

Агрегираните функции се използват подобно на имената на полета в клауза на заявка SELECT, с едно изключение: те приемат имена на полета като аргументи. Само числови полета могат да се използват със SUM и AVG.

Както цифровите, така и символните полета могат да се използват с COUNT, MAX и MIN. Когато се използват със символни полета, MAX и MIN ще ги преведат в еквивалент на ASCII код, който трябва да съобщи, че MIN ще означава първата, а MAX последната стойност по азбучен ред.

За да намерите SUM на всички заплати в таблицата DEPARTMENT_EMPLOYEE (фиг. 2.3), трябва да въведете следната заявка:

ОТ Отдел_ Служители;

И на екрана ще видим резултата: 46800 (таблицата ще има една колона с име SUM).

Изчисляването на средната стойност на заплатата също е просто:

ИЗБЕРЕТЕ СРЕДНА ((Заплата))

ОТ Отдел_ Служители;

Функцията COUNT е малко по-различна от всички останали. Той отчита броя на стойностите в дадена колона или броя на редовете в таблица. Когато преброява стойностите на колона, тя се използва с DISTINCT, за да преброи броя на уникалните стойности в дадено поле.

Таблицата има осем реда, съдържащи различни стойности на заплатите.

Имайте предвид, че последните три примера също вземат предвид информация за уволнени служители.

Следното изречение ви позволява да определите броя на разделенията на

DISTINCT, последвано от името на полето, към което се прилага, оградено в скоби, с COUNT, приложено към отделните колони.

ИЗБЕРЕТЕ БРОЯ (*)

ОТ Отдел_ Служители;

Отговорът ще бъде:

COUNT(*) брои всеки ред в таблицата.

DISTINCT не е приложимо с COUNT (*).

Да приемем, че таблицата PAYMENT_STATE (фиг. 2.4) има още една колона, която съхранява сумата на направените удръжки (поле Deduction) за всеки ред от извлечението. След това, ако се интересувате от цялата сума, тогава съдържанието на колоните Сума и Приспадане трябва да се сумират.

Ако се интересувате от максималната сума, като се вземат предвид удръжките, съдържаща се в извлечението, тогава това може да стане с помощта на следното изречение:

ИЗБЕРЕТЕ МАКС. (Сума + приспадане)

ОТ Pay_sheet;

За всеки ред в таблицата тази заявка ще добави стойността на полето Сума със стойността на полето Приспадане и ще избере най-голямата стойност, която намери.

ГРУПИРАНЕ ПО КЛАУЗА (пренареждане, ред)

Клаузата GROUP BY ви позволява да дефинирате подмножество от стойностите в определено поле по отношение на друго поле и да приложите обобщена функция към подмножеството. Това прави възможно комбинирането на полета и агрегатни функции в една клауза SELECT.

Да предположим например, че искате да определите колко служители има във всеки отдел (отговорът е показан на Фигура 4.21):

ИЗБЕРЕТЕ 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

Групирането може да се извърши по няколко атрибута:

ОТ Лист1

ГРУПИРАНЕ ПО Employee_id, дата;

Резултат:

Ориз. 4.24. Групиране по множество признаци

Ако има нужда да ограничите броя на групите, получени след GROUP BY, можете да приложите това с помощта на клаузата HAVING.

4.5. Използване на фразата HAVING

Клаузата HAVING играе същата роля за групите, както клаузата WHERE за редовете: тя се използва за изключване на групи, точно както WHERE се използва за изключване на редове. Тази фраза е включена в изречението

само ако има клауза GROUP BY и изразът в HAVING трябва да приеме една стойност за групата.

Например, да кажем, че трябва да покажем количествения състав на всички отдели (фиг. 2.3), с изключение на отдел номер 3.

ИЗБЕРЕТЕ Department_ID, COUNT (DISTINCT Department_ID) AS Брой _служители

Отдел_ Служители

Дата на уволнение

НАЛИЧАВАНЕ ID_отдел< > 3;

Брой служители

Последният елемент при оценяване на табличен израз е секцията HAVING (ако присъства). Синтаксисът за този раздел е както следва:

::=

ИМАЩ

Условието за търсене в този раздел определя условие за група редове в групирана таблица. Формално секцията HAVING може също да присъства в табличен израз, който не съдържа GROUP BY. В този случай се приема, че резултатът от изчислението на предишните дялове е групирана таблица, състояща се от една група без специални колони за групиране.

Условието за търсене на клаузата HAVING следва същите синтактични правила като условието за търсене на клаузата WHERE и може да включва същите предикати.

Съществуват обаче специални синтактични ограничения по отношение на използването в условието за търсене на спецификации на колони на таблица от клаузата FROM на даден израз на таблица. Тези ограничения следват от факта, че условието за търсене на секцията HAVING задава условието за цялата група, а не за отделни редове.

Следователно само спецификациите на колоните, посочени като групиращи колони в клаузата GROUP BY, могат да бъдат директно използвани в предикатни аритметични изрази, включени в клаузата за избор на клаузата HAVING. Останалите колони могат да бъдат посочени само в рамките на спецификациите на агрегатните функции COUNT, SUM, AVG, MIN и MAX, които в този случай изчисляват някаква обобщена стойност за цялата група редове. Ситуацията е подобна с подзаявките, включени в предикатите на условието за избор на секцията HAVING: ако подзаявката използва характеристика на текущата група, тогава тя може да бъде уточнена само чрез позоваване на колоните за групиране.

Нека заявката е във формата (за базовата таблица вижте фиг. 4.22):

ИЗБЕРЕТЕ Employee_id, дата, MAX ((сума))

ОТ Лист1

ГРУПИРАНЕ ПО Employee_id, дата;

необходимо е да се изясни, така че да се показват само плащания над 1000.

По стандарт обаче е незаконно да се използва агрегатна функция в клауза WHERE (освен ако не използвате подзаявка, описана по-късно), тъй като предикатите се оценяват по отношение на един ред, а агрегатните функции се оценяват по отношение на група редове .

Следното изречение би било неправилно:

ИЗБЕРЕТЕ Id_id, дата, MAX (сума)

ОТ Лист1

WHERE MAX ((сума)) > 1000 GROUP BY Comp_Id, дата;

Правилното изречение би било:

ИЗБЕРЕТЕ Employee_id, дата, MAX ((сума))