О. А. Ткачев

Основы программирования в СУБД Oracle. SQL+PL/SQL.


Скачать книгу

target="_blank" rel="nofollow" href="#image118_5fb6a064fdf8443aa6c3ec71_jpg.jpeg"/>

      Условие выборки может быть проверено до группировки. В этом случае сначала выбираются строки, удовлетворяющие условию, а потом осуществляется группировка полученных данных. Для полученных групп можно указать условие в предложении HAVING. В результат запроса попадут только те группы, которые удовлетворяют этому условию.

      Пример 4.13. Вывести должности и количество сотрудников, которые получают зарплату более 10 000

      SELECT department_id, SUM (salary)

      FROM Employees

      GROUP BY department_id

      HAVING SUM (salary)> 50000;

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

      Пример 4.14. Вывести должности и количество сотрудников, которые получают зарплату более 10 000, которые занимают более одного сотрудника, упорядочив их в порядке убывания количества сотрудников

      SELECT job_id, COUNT (*) As num_job

      FROM Employees

      WHERE salary> 10000

      GROUP BY job_id

      HAVING COUNT (*)> 1

      ORDER BY num_job DESC;

      Пример 4.15. Вывести номера отделов, у которых число сотрудников, имеющих рейтинг 5, больше одного, количество сотрудников, имеющих рейтинг 5, и их суммарную зарплату

      SELECT department_id, rating_e, count (*),sum (salary)

      FROM Employees

      WHERE rating_e = 5

      GROUP BY department_id, rating_e

      HAVING count (*)> 1

      ORDER BY department_id;

      Использование вложенных агрегатных функций

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

      Пример 4.16. Определить количество сотрудников в каждом отделе

      SELECT department_id, count (*)

      FROM Employees

      GROUP BY department_id

      ORDER BY department_id;

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

      Пример 4.17. Найти максимальное число сотрудников работающих в одном отделе

      SELECT Max (COUNT (*))

      FROM Employees

      GROUP BY department_id;

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

      Пример 4.18. Найти отдел, в котором работает максимальное число сотрудников.

      SELECT department_id, COUNT (*)

      FROM Employees

      GROUP BY department_id

      HAVING COUNT (*) =

      (SELECT MAX (COUNT (*))

      FROM Employees

      GROUP BY department_id);

      Использование специальных операторов группировки

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

      Оператор GROUP BY ROLLUP

      Расширяет возможности GROUP BY, возвращая для каждой группы строку, содержащую итоги по группе, а также строку, содержащую общий итог для всех групп, и имеет следующий вид:

      GROUP