GROUP BY (Transact-SQL)

Изменения: 17 июля 2006 г.

Задает группы, в которые должны быть помещены строки вывода. Если в предложение SELECT <список выбора> включены статистические функции, инструкция GROUP BY вычисляет сводные значения для каждой группы. Если задано предложение GROUP BY, либо каждый столбец во всех нестатистических выражениях в списке выбора должен включаться в список GROUP BY, либо выражение GROUP BY должно точно соответствовать выражению списка выбора.

ms177673.note(ru-ru,SQL.90).gifПримечание.
Если не задано предложение ORDER BY, группы, возвращаемые предложением GROUP BY, не упорядочиваются. Чтобы определить конкретный порядок данных, рекомендуется всегда использовать предложение ORDER BY.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

[ GROUP BY [ ALL ] group_by_expression [ ,...n ] 
    [ WITH { CUBE | ROLLUP } ] 
] 

Аргументы

  • ALL
    Включает все группы и результирующие наборы (даже не имеющие строк), которые удовлетворяют условию поиска заданного в предложении WHERE. Если задан аргумент ALL, для сводных столбцов групп, не удовлетворяющие условию поиска, возвращаются значения NULL. Аргумент ALL нельзя указывать с операторами CUBE или ROLLUP.

    Предложение GROUP BY ALL не поддерживается в запросах с доступом к удаленным таблицам, если в запросе присутствует также предложение WHERE.

  • group_by_expression
    Выражение, по которому выполняется группирование. Аргумент group_by_expression также называется столбцом группирования. Аргумент group_by expression может быть столбцом или нестатистическим выражением, которое ссылается на столбец, возвращаемый предложением FROM. Псевдоним столбца, который определяется в списке выбора, не может использоваться для указания столбца группирования.

    ms177673.note(ru-ru,SQL.90).gifПримечание.
    Столбцы типа text, ntext и image нельзя использовать в аргументе group_by_expression.

    Для предложений GROUP BY, не содержащих операторов CUBE или ROLLUP, количество элементов group_by_expression ограничивается размером столбцов GROUP BY, статистически обрабатываемых столбцов и статистических значений, включенных в запрос. Это объясняется ограничением размера промежуточной рабочей таблицы (8 060 байт), необходимой для хранения промежуточных результатов запроса. При указании CUBE или ROLLUP максимально разрешенное количество выражений группирования равно 10.

    Методы для типа данных xml нельзя указывать непосредственно в аргументе group_by_expression. Вместо этого следует создать ссылку на пользовательскую функцию, которая включает методы для типа данных xml или ссылается на вычисляемый столбец, использующий эти методы.

  • CUBE
    Указывает, что помимо стандартных строк, предоставленных предложением GROUP BY, в результирующий набор вводятся сводные строки. Сводная строка GROUP BY возвращается для всех возможных сочетаний групп и подгрупп в результирующем наборе. Сводная строка GROUP BY в результате выводится как значение NULL, но используется для указания всех значений. Чтобы определить, представляют ли значения NULL в результирующем наборе сводные значения GROUP BY, используйте функцию GROUPING.

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

  • ROLLUP
    Указывает, что помимо стандартных строк, предоставленных GROUP BY, в результирующий набор вводятся сводные строки. Группы обобщаются в иерархическом порядке, начиная с самого нижнего уровня в группе и заканчивая самым верхним. Иерархия группы определяется порядком, в котором заданы столбцы, по которым производится группирование. Изменение порядка столбцов, по которым производится группирование, может повлиять на количество строк в результирующем наборе.

    ms177673.note(ru-ru,SQL.90).gifВажно!
    Статистические вычисления с ключевым словом DISTINCT, например AVG(DISTINCT column_name), COUNT(DISTINCT column_name) и SUM(DISTINCT column_name) при использовании CUBE и ROLLUP не поддерживаются. Если они используются, компонент Microsoft SQL Server 2005 Database Engine возвращает сообщение об ошибке и отменяет запрос.

Примеры

A. Использование простого предложения GROUP BY

В следующем примере происходит извлечение суммы для каждого SalesOrderID из таблицы SalesOrderDetail.

USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;

Б. Использование предложения GROUP BY с несколькими таблицами

В следующем примере извлекается количество работников для каждого города City из таблицы Address, соединенной с таблицей EmployeeAddress.

USE AdventureWorks ;
GO
SELECT a.City, COUNT(ea.AddressID) EmployeeCount
FROM HumanResources.EmployeeAddress ea 
INNER JOIN Person.Address a
ON ea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City ;

В. Использование предложения GROUP BY в выражениях

В следующем примере показано, как извлечь данные об общем объеме продаж за каждый год с помощью функции DATEPART. Одно и то же выражение должно присутствовать как в списке выборки, так и в предложении GROUP BY.

USE AdventureWorks ;
GO
SELECT DATEPART(yyyy,OrderDate) AS Year,
SUM(TotalDue) AS AverageOrderAmt
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate)
ORDER BY DATEPART(yyyy,OrderDate) ;

См. также

Справочник

SELECT (Transact-SQL)
Выражение SELECT (Transact-SQL)

Другие ресурсы

Суммирование данных с помощью оператора CUBE
Определение итоговых данных с помощью оператора ROLLUP

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

17 июля 2006 г.

Новое содержимое.
  • Добавлен пример В.

5 декабря 2005 г.

Измененное содержимое.
  • Исправлен пример Б.