Пример GROUPING SETS

Запрос, показанный на рисунке, вычисляет агрегаты по двум группированиям.

12-15-7187749

Таблица делится на следующие группы:

  • идентификатор подразделения, идентификатор должности (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

GROUP BY job_id, manager_id;

В отсутствие оптимизатора, который просматривает блоки запроса для создания плана выполнения, предыдущему запросу понадобилось бы два сканирования базовой таблицы EMPLOYEES. Это может быть очень неэффективно. Следовательно, рекомендуется использовать инструкцию GROUPING SETS.

Далее: Обзор функций SQL

Related Posts