SELECT AVG(MIN(Salary)) AS AVG_MIN,
AVG(MAX(Salary)) AS AVG_MAX,
MIN(AVG(Salary)) AS MIN_AVG,
MAX(AVG(Salary)) AS MAX_AVG
FROM TEACHER
GROUP BY Dolgnost ;
Условие отбора групп
Предположим, что нужно вывести номера кафедр, у которых суммарное
количество работающих профессоров более 1. Приведенная ниже формулировка запроса
является неверной:
SELECT KOD_kafedru
FROM TEACHER
WHERE count(dolgnost) > 1 and dolgnost=’профессор’
GROUP BY KOD_kafedru;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WHERE count(dolgnost) > 3 and dolgnost=’профессор’;
*
Ошибка в строке 3;
CRA-00934: групповая функция здесь не разрешена
Дело в том, что фраза WHERE проверяет на соответствие условию строки
исходных таблиц, а мы указали в ней агрегатную функцию. Для отбора строк среди
полученных групп следует применять фразу HAVING. Она играет такую же роль для
групп, что и фраза WHERE для исходных таблиц, и может использоваться лишь при
наличии фразы GROUP BY. В предложении SELECT фразы WHERE, GROUP BY и
HAVING обрабатываются в следующем порядке.
Фразой WHERE отбираются строки, удовлетворяющие указанному в ней условию.
Фраза GROUP BY группирует отобранные строки.
Фразой HAVING отбираются группы, удовлетворяющие указанному в ней
условию. В связи с вышесказанным, предыдущий запрос необходимо записать так.
Перепишем тогда запрос так:
Запрос 22. Вывести номера кафедр, у которых суммарное количество работающих
профессоров более 1.
SELECT KOD_kafedru as "Номер кафедры" ,Count(*) as "Кол-во профессоров
на кафедре"
FROM TEACHER
WHERE dolgnost='профессор'
GROUP BY KOD_kafedru
having count(dolgnost) > 1 ;
141
Do'stlaringiz bilan baham: |