Предложение GROUPING SETS – это дальнейшее расширение предложения GROUP BY, которое можно использовать, чтобы задать несколько группирований данных.

Такой подход облегчает эффективное агрегирование и, следовательно, упрощает анализ данных по нескольким измерениям.
-
Синтаксис предложения GROUPING SETS используется для определения нескольких группирований в одном и том же запросе.
-
Все группирования, заданные в предложении
GROUPING SETS, являются вычисляемыми, и результаты отдельных группирований объединяются операциейUNION ALL.
-
Достоинства предложения
GROUPING SETS:-
Требуется только один проход по базовой таблице.
-
Не нужно создавать сложные инструкции
UNION. -
Чем больше элементов содержит предложение
GROUPING SETS, тем больше выигрыш в производительности.
-
Вместо нескольких инструкций SELECT, объединенных операторами UNION ALL, использование предложения GROUPING SETS позволяет написать одну инструкцию SELECT, определяющую несколько группирований (в которые также могут входить операторы ROLLUP или CUBE). Например:
SELECT department_id, job_id, manager_id, AVG(salary) FROM employees GROUP BY GROUPING SETS ((department_id, job_id, manager_id),
|
Эта инструкция вычисляет агрегаты по трем группированиям:
(department_id, job_id, manager_id), (department_id, manager_id)and (job_id, manager_id)
Без данной функции для получения результата, аналогичного приведенной инструкции SELECT, потребовалось бы несколько запросов, объединенных с помощью UNION ALL. Использование нескольких запросов неэффективно, так как требует нескольких сканирований одних и тех же данных.
Сравните предыдущий пример со следующей альтернативой:
SELECT department_id, job_id, manager_id, AVG(salary) FROM employees
|
Эта инструкция вычисляет все 8 (2 *2 *2) группирований, но нас интересуют только группы(department_id, job_id, manager_id), (department_id, manager_id) и (job_id, manager_id).
Еще одним вариантом является следующая инструкция:
SELECT department_id, job_id, manager_id, AVG(salary) FROM employees GROUP BY department_id, job_id, manager_id UNION ALL SELECT department_id, NULL, manager_id, AVG(salary) FROM employees GROUP BY department_id, manager_id UNION ALL SELECT NULL, job_id, manager_id, AVG(salary) FROM employees
|
Для этой инструкции требуются три сканирования базовой таблицы, что снижает производительность.
Операторы CUBE и ROLLUP можно считать наборами группирований с очень специфическими результатами и семантикой. Этот факт иллюстрируется следующими эквивалентами:
Далее: Обзор сортировки данных