Суммирование данных с помощью COMPUTE и COMPUTE BY

Предложения COMPUTE и COMPUTE BY предназначены для обратной совместимости. Вместо них пользуйтесь следующими компонентами.

Предложение COMPUTE BY позволяет получить и отдельные, и сводные строки одной инструкцией SELECT. Сводные значения можно вычислять для подгрупп или всего результирующего набора.

Предложение COMPUTE принимает следующие данные.

  • Необязательное ключевое слово BY. При этом вычисляется сводка строк по столбцам.
  • Имя статистической функции. К ним относятся функции SUM, AVG, MIN, MAX или COUNT.
  • Столбец, к которому будет применена статистическая функция.

Результирующие наборы, формируемые предложением COMPUTE

Сводные значения, формируемые предложением COMPUTE, отображаются в результатах запроса как отдельные результирующие наборы. Результаты запроса, в который входит предложение COMPUTE, похожи на секционный отчет. Это отчет, сводные значения которого определяются заданным группированием, или разбивками. Можно подсчитывать сводные значения для групп, можно также вычислять несколько статистических функций для одной группы.

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

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

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

  • Первый результирующий набор — все отдельные строки, выбранные запросом.
  • Второй результирующий набор — одна строка, содержащая итоговые значения статистических функций, заданных в предложении COMPUTE.

Примеры использования COMPUTE

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

USE AdventureWorks
SELECT SalesOrderID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID
COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount)

В следующем запросе к предложению COMPUTE добавлено необязательное ключевое слово BY, которое подсчитывает подытоги для каждого заказа:

USE AdventureWorks
SELECT SalesOrderID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID
COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount) BY SalesOrderID

Результат этой инструкции SELECT будет содержать по два набора строк для каждого заказа. В первом результирующем наборе будет набор строк, содержащих данные, выбранные запросом. Во втором результирующем наборе будут подытоги двух функций SUM предложения COMPUTE.

ms190452.note(ru-ru,SQL.90).gifПримечание.
В некоторых программах, например osql, несколько итогов и подытогов появляются в виде, когда каждый подытог занимает отдельную строку результирующего набора. Это зависит только от того, как программа форматирует вывод; вообще итоги и подытоги возвращаются в одной строке. В других приложениях, например среде SQL Server Management Studio, все итоги и подытоги умещаются на одну строку.

Сравнение COMPUTE и GROUP BY

Далее перечислены различия между предложениями COMPUTE и GROUP BY.

  • GROUP BY создает один результирующий набор. Для каждой группы используется одна строка, содержащая только столбцы, по которым производится группировка, и результаты вычисления статистических функций — подытоги для группы. Список значений выборки, содержит только столбцы, по которым производится группировка, и результаты статистических функций.
  • GROUP BY создает несколько результирующих наборов. Один результирующий набор состоит из отдельных строк для каждой группы, содержащей условие выборки. Другой результирующий набор состоит из подытогов группы или итога для всех результатов инструкции SELECT. Список значений выборки содержит не только столбцы, по которым производится группировка и к которым применяются статистические функции. Статистические функции указываются в предложении COMPUTE, а не в списке выборки.

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

USE AdventureWorks
SELECT SalesOrderID, SUM(UnitPrice), SUM(UnitPriceDiscount)
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ms190452.note(ru-ru,SQL.90).gifПримечание.
Столбцы типов ntext, text и image в предложения COMPUTE и GROUP BY включать нельзя.

См. также

Основные понятия

Основные принципы запросов

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

SELECT (Transact-SQL)

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

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