Группирование по выражениям над столбцами
Запрос. По каждому значению зарплаты, не превышающему 800, выдать это значение и количество преподавателей, такую зарплату получающие.
SELECT Salary + Rise, COUNT(*) FROM TEACHER WHERE Salary + Rise <= 800
GROUP BY Salary + Rise;
SALARY+RISE COUNT(*)
----------- ----------
720 1
740 1
750 2
800 1
• 4 строк выбрано.
Вкладывание агрегатных функций
SELECT AVG(MIN(Salary)) FROM
TEACHER;
ORA-00978: вложенная групповая функция без GROUP BY
Значения NULL в столбцах группирования
Запрос. По каждому номеру телефона указать количество преподавателей, которые ими пользуются.
SELECT NVL(Tel, 'NULL VALUE') AS "Телефоны", Count(*)
FROM TEACHER
GROUP BY Tel;
Телефоны COUNT(*)
---------- ----------
2152295 2
5135472 1
5135497 2
5139827 5 NULL VALUE 5
• 5 строк выбрано.
Условие отбора групп
Запрос А.Получить сведения о тех корпусах, суммарное количество мест аудиторий которых превышает 100.
SELECT Building FROM ROOM WHERE
SUM(Seats) > 100 GROUP BY Building;
WHERE SUM(Seats) > 100 * Ошибка в строке 3: ORA-00934: групповая функция здесь не разрешена
является неверной, так как фраза WHERE проверяет условия только на отдельных строках, а мы указали в ней агрегатную функцию, которая вычисляется на группе.
WHERE, GROUP BY и HAVING
обрабатываются в следующем порядке:
•если имеется фраза WHERE, то удаляются те строки, которые не удовлетворяют условию этой фразы;
•согласно фразе GROUP BY формируются группы строк;
•удаляются те группы, которые не удовлетворяют условию фразы
HAVING.
Для выражения условий, которые задаются на группах строк, следует применять фразу HAVING.
Фраза играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, определяемых фразой GROUP BY, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии фразы GROUP BY, и она должна принимать единственное логическое условие для любой из сформированных групп.