Поделиться через


Суммирование данных с помощью 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 AdventureWorks2008R2;
GO
SELECT SalesOrderID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID
COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount);

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

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

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

ПримечаниеПримечание

В некоторых программах, например в osql, несколько итогов и подытогов появляются в виде, когда каждый подытог занимает отдельную строку результирующего набора. Это зависит только от того, как программа форматирует вывод; вообще итоги и подытоги возвращаются в одной строке. В других приложениях, например в среде Среда SQL Server Management Studio, все итоги и подытоги умещаются на одну строку.

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

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

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

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

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

USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, SUM(UnitPrice), SUM(UnitPriceDiscount)
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID;
ПримечаниеПримечание

Типы данных ntext, text или image не могут быть указаны в предложении COMPUTE или COMPUTE BY.

См. также

Справочник

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