Классика баз данных - статьи

       

GROUPING SETS


В предыдущих разделах обсуждалось, каким образом можно использовать операции ROLLUP и CUBE в разделе GROUP BY для выполнения детального анализа данных в одном или нескольких измерениях. DB2 UDB поддерживает также некоторые другие виды специальной группировки. Например, может понадобиться анализировать данные в одном измерении без выполнения полного ROLLUP, анализировать несколько измерений без формирования полного CUBE или просто выполнять определенные виды группировки, которые приходят в голову. DB2 UDB позволяет точно специфицировать желаемые виды групп с помощью операции GROUPING SET.

Для использования GROUPING SETS нужно просто указать список видов групп, которые должна сформировать система. Если некоторые критерии группировки включают более одного столбца или выражения, эти критерии заключаются в скобки. Можно использовать пустые скобки для обозначения единственной группы, которая охватывает всю таблицу. Запрос следующего примера разбивает данные переписи на группы по state и sex, затем формирует другие группы по году рождения и в завершение формирует одну большую группу, состоящую из всей таблицы Census. Для каждой группы отображается число человек в группе и средняя сумма дохода группы. Как и раньше, в этом запросе используется функция grouping для отображения специальной строки, когда неопределенное значение имеет специальный смысл "все значения".

SELECT CASE grouping(state) WHEN 1 THEN '(-all-)' ELSE state END AS state, CASE grouping(sex) WHEN 1 THEN '(-all') ELSE sex END AS sex, CASE grouping(year(birthdate)) WHEN 1 THEN '(-all)' ELSE char(year(birthdate)) END AS birth_year, count(*) as count, avg(income) AS avg_income FROM census GROUP BY GROUPING SETS ((state, sex), year(birthdate), ());

В таблице 6 приведены результаты этого запроса. Общее число групп в этом результате есть сумма числа групп, произведенных по каждому из трех наборов группировки: (state, sex) производит четыре группы, year(birthdate) производит четыре группы и пустой набор группировки () производит одну группу, представляющую всю таблицу; всего образуется девять групп.


STATE SEX BIRTH_YEAR COUNT AVG_INCOME
FL F (-all-) 4 38350
FL M (-all-) 6 34333
TX F (-all-) 3 39750
TX M (-all-) 5 34620
(-all-) (-all-) 1955 6 37200
(-all-) (-all-) 1956 5 35920
(-all-) (-all-) 1957 6 33616
(-all-) (-all-) (null) 1 44700
(-all-) (-all-) (-all-) 18 36000
Таблица 6. Результаты запроса с GROUPING SETS


Содержание раздела