Spec-Zone .ru
спецификации, руководства, описания, API

12.17.2. GROUP BY Модификаторы

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 вывод:

Другие Соображения При использовании 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.