Запрос, показанный на рисунке, вычисляет агрегаты по двум группированиям.
Таблица делится на следующие группы:
-
идентификатор подразделения, идентификатор должности (department_id, job_id);
-
идентификатор должности, идентификатор менеджера (job_id, manager_id).
Для каждой из этих групп рассчитываются средние оклады. Набор результатов содержит средний оклад для каждой из двух этих групп.
В результатах группа, помеченная как 1, может интерпретироваться следующим образом:
-
Средний оклад всех сотрудников на должности
SH_CLERK
, подчиняющихся менеджеру 122, составляет 3200. -
Средний оклад всех сотрудников на должности
AC_MGR
, подчиняющихся менеджеру 101, составляет 12 000 и т. д.
Группа, помеченная как 2, интерпретируется следующим образом:
-
Средний оклад всех сотрудников на должности
AC_MGR
в подразделении 110 составляет 12 000. -
Средний оклад всех сотрудников на должности
AD_PRES
в подразделении 90 составляет 24 000 и т. д.
Приведенный на рисунке пример также может быть получен следующим образом:
SELECT department_id, job_id, NULL as manager_id, AVG(salary) as AVGSAL FROM employees GROUP BY department_id, job_id UNION ALL SELECT NULL, job_id, manager_id, avg(salary) as AVGSAL FROM employees
|
В отсутствие оптимизатора, который просматривает блоки запроса для создания плана выполнения, предыдущему запросу понадобилось бы два сканирования базовой таблицы EMPLOYEES
. Это может быть очень неэффективно. Следовательно, рекомендуется использовать инструкцию GROUPING SETS.
Далее: Обзор функций SQL