MS SQL Server - Выборка данных - Секция GROUP BY (CUBE и ROLLUP)

MS SQL Server

Секция GROUP BY

Секция GROUP BY предназначена для включения промежуточных результатов в итоговый набор. Она используется в сочетании с агрегатными функциями (агрегатные функции подробно описаны ниже) для получения обобщающих данных. Агрегатная функция обрабатывает данные нескольких записей и вычисляет обобщающий результат, возвращаемый как часть списка выборки. При использовании GROUP BY все столбцы итогового набора либо являются агрегатными функциями, либо включаются в секцию GROUP BY. Секция GROUP BY имеет следующий синтаксис:

GROUP BY [ALL] список_группировки [WITH CUBE|ROLLUP]

Ключевое слово ALL требует, чтобы SQL Server создавал записи для столбцов, для которых на основании секции WHERE не должны создаваться записи. Список группировки может содержать любые столбцы из списка выборки. Любое изменение значений в столбцах, входящих в список группировки, приводит к вычислению нового результата. Кроме того, можно выбрать особый тип группировки с помощью необязательных ключевых слов CUBE или ROLLUP.

CUBE и ROLLUP

Ключевые слова CUBE и ROLLUP предназначены для выполнения многомерного анализа данных в одной команде SQL. Они не могут одновременно присутствовать в командах SQL. CUBE и ROLLUP создают итоговые наборы той формы, которая обычно используется в отчетах. Сводные данные возвращаются в виде отдельных итоговых наборов, смешанных с итоговыми наборами каждой группы, или дописываются в конец главного итогового набора.
• При использовании CUBE или ROLLUP секция GROUP BY может содержать не более 10 столбцов или выражений, а возвращаемые данные должны иметь размер не более 8060 байт.
• Секция GROUP BY должна содержать по крайней мере один столбец или выражение.
• При использовании ключевых слов CUBE или ROLLUP ключевое слово DISTINCT нельзя использовать с агрегатными функциями.
• С ключевыми словами CUBE или ROLLUP нельзя использовать формулировку GROUP BY ALL.
• CUBE и ROLLUP могут использоваться с любыми агрегатными функциями.

CUBE

При наличии ключевого слова CUBE в дополнение к обычным сводным данным, обусловленным секцией GROUP BY, в итоговый набор включаются сводные записи (агрегаты). Эти записи генерируются посредством группировки подмножества столбцов в секции GROUP BY.
Каждое сочетание значений столбцов, входящих в секцию GROUP BY, порождает совокупность групп. Для каждого неповторяющегося значения столбца из списка группировки CUBE создает дополнительную запись, в которой столбцу присвоено значение NULL. Это значение NULL представляет все значения данного столбца. Агрегатные функции в списке выборки применяются к этим группам для получения сводных данных, при этом генерируются дополнительные записи.
Оператор CUBE позволяет строить перекрестные ссылки без необходимости написания дополнительных процедур. Оператор CUBE создает все сочетания группировок из списка столбцов в секции GROUP BY. Пример использования ключевого слова CUBE:

SELECT stor_id, pub_name, title, AVG(qty)
FROM sales, titles, publishers
WHERE sales.title_id = titles.title_id
AND publishers.pub_id = titles.pub_id
GROUP BY pub_name, title, stor_id
WITH CUBE

Команда генерирует дополнительные агрегатные записи, при этом CUBE вычисляется для AVG(qty).

ROLLUP

Ключевое слово ROLLUP используется для определения агрегата. Это бывает удобно для вложенных наборов (например, сумм или средних арифметических столбцов). Основное отличие ROLLUP от CUBE заключается в том, что ROLLUP учитывает позицию столбца в секции GROUP BY. Группировка ROLLUP образуется из столбцов, расположенных справа от значения текущего столбца. Пример использования ключевого слова ROLLUP:

SELECT stor_id, pub_name, title, AVG(qty)
FROM sales, titles, publishers
WHERE sales.title_id = titles.title_id
AND publishers.pub_id = titles.pub_id
GROUP BY pub_name, title, stor_id
WITH ROLLUP

Команда генерирует дополнительные агрегатные записи, при этом ROLLUP вычисляется для AVG(qty).


 

Добавить комментарий


Защитный код
Обновить