Spec-Zone .ru
спецификации, руководства, описания, API
|
GROUP BY
пункт разрешает a WITH ROLLUP
модификатор,
который заставляет дополнительные строки быть добавленными к сводному выводу. Эти строки представляют более
высокий уровень (или суперагрегат) сводные операции. ROLLUP
таким образом позволяет
Вам ответить на вопросы на многократных уровнях анализа с единственным запросом. Это может использоваться,
например, чтобы оказать поддержку для OLAP (Оперативная аналитическая обработка) операции.
Предположите что названная таблица sales
имеет year
,
country
, product
, и profit
столбцы для того, чтобы записать доходность продаж:
CREATE TABLE sales( year INT NOT NULL, country VARCHAR(20) NOT NULL, product VARCHAR(32) NOT NULL, profit INT);
Содержание таблицы может быть получено в итоге ежегодно с простым GROUP BY
как это:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY
year;
+------+-------------+| year | SUM(profit) |+------+-------------+| 2000 | 4525 || 2001 | 3010 |+------+-------------+
Этот вывод показывает полную прибыль в течение каждого года, но если Вы также хотите определить полную прибыль, суммированную за все годы, следует сложить отдельные значения самостоятельно или выполнить дополнительный запрос.
Или можно использовать ROLLUP
, который обеспечивает оба уровня анализа с
единственным запросом. Добавление a WITH ROLLUP
модификатор к GROUP BY
пункт заставляет запрос производить другую строку, которая показывает
общий итог по всем значениям года:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY
year WITH ROLLUP;
+------+-------------+| year | SUM(profit) |+------+-------------+| 2000 | 4525 || 2001 | 3010 || NULL | 7535 |+------+-------------+
Итоговая строка суперагрегата идентифицируется значением NULL
в year
столбец.
ROLLUP
имеет более сложный эффект, когда там многократны GROUP
BY
столбцы. В этом случае каждый раз есть "повреждение" (изменение в значении) в любом, но последний столбец
группировки, запрос производит дополнительную суперсовокупную сводную строку.
Например, без ROLLUP
, сводка на sales
таблица,
основанная на year
, country
, и product
мог бы быть похожим на это:
mysql>SELECT year, country, product, SUM(profit)
->FROM sales
->GROUP BY year, country, product;
+------+---------+------------+-------------+| year | country | product | SUM(profit) |+------+---------+------------+-------------+| 2000 | Finland | Computer | 1500 || 2000 | Finland | Phone | 100 || 2000 | India | Calculator | 150 || 2000 | India | Computer | 1200 || 2000 | USA | Calculator | 75 || 2000 | USA | Computer | 1500 || 2001 | Finland | Phone | 10 || 2001 | USA | Calculator | 50 || 2001 | USA | Computer | 2700 || 2001 | USA | TV | 250 |+------+---------+------------+-------------+
Вывод указывает, что сводка оценивает только в уровень года/страны/продукта анализа. Когда ROLLUP
добавляется, запрос производит несколько дополнительных строк:
mysql>SELECT year, country, product, SUM(profit)
->FROM sales
->GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+| year | country | product | SUM(profit) |+------+---------+------------+-------------+| 2000 | Finland | Computer | 1500 || 2000 | Finland | Phone | 100 || 2000 | Finland | NULL | 1600 || 2000 | India | Calculator | 150 || 2000 | India | Computer | 1200 || 2000 | India | NULL | 1350 || 2000 | USA | Calculator | 75 || 2000 | USA | Computer | 1500 || 2000 | USA | NULL | 1575 || 2000 | NULL | NULL | 4525 || 2001 | Finland | Phone | 10 || 2001 | Finland | NULL | 10 || 2001 | USA | Calculator | 50 || 2001 | USA | Computer | 2700 || 2001 | USA | TV | 250 || 2001 | USA | NULL | 3000 || 2001 | NULL | NULL | 3010 || NULL | NULL | NULL | 7535 |+------+---------+------------+-------------+
Для этого запроса, добавляя ROLLUP
заставляет вывод включать информацию о сводке в
четыре уровня анализа, не только один. Вот то, как интерпретировать ROLLUP
вывод:
После каждого набора строк продукта в течение данного года и страны, дополнительная
сводная строка производится, показывая общее количество для всех продуктов. Эти строки имеют product
набор столбца к NULL
.
После каждого набора строк в течение данного года дополнительная сводная строка
производится, показывая общее количество для всех стран и продуктов. Эти строки имеют country
и products
набор столбцов к NULL
.
Наконец, после всех других строк, дополнительная сводная строка производится,
показывая общий итог в течение всех лет, стран, и продуктов. Эта строка имеет year
, country
, и products
набор столбцов к NULL
.
Другие Соображения При использовании ROLLUP
Следующие элементы перечисляют некоторые поведения, определенные для реализации MySQL ROLLUP
:
Когда Вы используете ROLLUP
, невозможно также использовать ORDER
BY
пункт, чтобы сортировать результаты. Другими словами, ROLLUP
и ORDER BY
являются взаимоисключающими. Однако, Вы все еще имеете некоторый контроль
над порядком сортировки. GROUP BY
в результатах видов MySQL, и можно использовать
явный ASC
и DESC
ключевые слова со столбцами,
названными в GROUP BY
список, чтобы определить порядок сортировки для отдельных
столбцов. (Высокоуровневые сводные строки, добавленные ROLLUP
все еще появитесь
после строк, от которых они вычисляются, независимо от порядка сортировки.)
LIMIT
может использоваться, чтобы ограничить число строк, возвращенных клиенту.
LIMIT
применяется после ROLLUP
, таким образом, предел
применяется против дополнительных строк, добавленных ROLLUP
. Например:
mysql>SELECT year, country, product, SUM(profit)
->FROM sales
->GROUP BY year, country, product WITH ROLLUP
->LIMIT 5;
+------+---------+------------+-------------+| year | country | product | SUM(profit) |+------+---------+------------+-------------+| 2000 | Finland | Computer | 1500 || 2000 | Finland | Phone | 100 || 2000 | Finland | NULL | 1600 || 2000 | India | Calculator | 150 || 2000 | India | Computer | 1200 |+------+---------+------------+-------------+
Используя LIMIT
с ROLLUP
может привести к результатам,
которые более трудно интерпретировать, потому что у Вас есть меньше контекста для того, чтобы понять
суперсовокупные строки.
NULL
индикаторы в каждой суперсовокупной строке производятся, когда строка
отправляется клиенту. Сервер смотрит на столбцы, названные в GROUP BY
пункт после
крайнего левого, который изменил значение. Для любого столбца в наборе результатов с именем, которое является
лексическим соответствием к любому из тех имен, его значение устанавливается в NULL
.
(Если Вы определяете группирующиеся столбцы номером столбца, сервер идентифицирует который столбцы установить в
NULL
числом.)
Поскольку NULL
значения в суперсовокупных строках помещаются в набор результатов в
такую позднюю стадию в обработке запроса, невозможно протестировать их как NULL
значения в пределах запроса непосредственно. Например, невозможно добавить HAVING product
IS NULL
к запросу, чтобы устранить из вывода всех кроме суперсовокупных строк.
С другой стороны, NULL
значения действительно появляются как NULL
на стороне клиента и может быть протестирован использование как таковое любого клиентского интерфейса
программирования MySQL.