Group By и having

Работа с функциями агрегирования существенно отличается от выбора поля тем, что выходные данные содержат единственное значение независимо от количества строк в таблице. По этой причине агрегатные функции и поля не могут выбираться одновременно.

Для реализации такой возможности, существует предложение GROUP BY. Указанное предложение, определяет подмножество значений отдельного поля в терминах другого поля и позволяет применять функции агрегирования к полученному подмножеству. Это дает возможность комбинировать поля и агрегатные функции в одном предложении SELECT. GROUP BY применяет агрегатные функции отдельно к каждой серии групп, которые определяются общим значением поля. Это обозначает, что поле, к которому применяется GROUP BY по определению имеет на выходе только одно значение на каждую групп, что соответсвует применению агрегатных функций. Такая совместимость результатов, как раз-то и позволяет комбинировать агрегаты с полями указанным способом.

К примеру, нас интересует книга с минимальным количеством страниц выпущенная тем или иным издательсвом:

SELECT Press.Name, Min(Books.Pages) AS [Минимальное колличество страниц]

FROM Books, Press

WHERE Books.Id_Press=Press.ID

GROUP BY Press.Name;

Теперь, предположим, нас инетересует название издательств, которые выпустили книги со средним количеством страниц большим 100.

SELECT Press.Name, AVG(Books.Pages) AS [Среднее колличество страниц]

FROM Books, Press

WHERE Books.Id_Press=Press.ID

GROUP BY Press.Name

HAVING AVG(Books.Pages)>100;

Как Вы заметили, в предыдущем запросе использовалось новое предложение HAVING, которое определяет критерий, согласно которому определенные группы исключаются из числа выходных данных, по аналогии с тем, как это делает предложение WHERE для отдельных строк. Аргументы, используемые в предложении HAVING, подчиняются тем же правилам, что и агрументы SELECT в команде, использующей GROUP BY. Также, аргументы HAVING должны иметь единственное значение для каждой группы выходных данных.

Еще один пример на агрегатные функции, GROUP BY и HAVING: "Вывести общую сумму страниц всех имеющихся в библиотеке книг, выпущенных издательствами BHV и БИНОМ"

SELECT Press.Name, SUM(Books.Pages) AS [Среднее колличество страниц]

FROM Books, Press

WHERE Books.Id_Press=Press.ID

GROUP BY Press.Name

HAVING Press.Name IN ('BHV', 'Бином');


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: