You are on page 1of 7

1

BASES DE DATOS
Clusulas COMPUTE y COMPUTE BY
Una clusula COMPUTE BY permite ver las filas de detalle y de resumen con una

instruccin SELECT. Puede calcular valores de resumen para subgrupos, o un valor de


resumen para el conjunto completo de resultados. La clusula COMPUTE toma la siguiente informacin: La palabra clave opcional BY. Calcula el agregado de fila especificado en una base por columna. Un nombre de funcin de agregado de fila. Incluye SUM, AVG, MIN, MAX o COUNT. Una columna en la que realizar la funcin de agregado de fila.

CONJUNTOS DE RESULTADOS GENERADOS POR COMPUTE Los valores de resumen generados por COMPUTE aparecen como conjuntos separados de resultados en los resultados de la consulta. Los resultados de una consulta que incluye una clusula COMPUTE son como un informe de interrupcin de control. ste es un informe cuyos valores de resumen son controlados por las agrupaciones o interrupciones que especifique. Puede producir valores de resumen para grupos, y tambin puede calcular ms de una funcin de agregado para el mismo grupo. Cuando se especifica COMPUTE con la clusula opcional BY, hay dos conjuntos de resultados por cada grupo que califica la instruccin SELECT: El primer conjunto de resultados de cada grupo tiene el conjunto de filas de detalles que contienen la informacin de la lista de seleccin para ese grupo. El segundo conjunto de resultados de cada grupo tiene una fila que contiene los subtotales de las funciones de agregado especificadas en la clusula COMPUTE para ese grupo.

Cuando se especifica COMPUTE sin la clusula opcional BY, hay dos conjuntos de resultados para la instruccin SELECT: El primer conjunto de resultados de cada grupo tiene todas las filas de detalles que contienen informacin de la lista de seleccin. El segundo conjunto de resultados tiene una fila que contiene los totales de las funciones de agregado especificadas en la clusula COMPUTE.

EJEMPLOS QUE UTILIZAN COMPUTE

Bases de Datos

Ing. Rosa Navarrete

2
En la siguiente instruccin SELECT se utiliza una clusula COMPUTE simple para crear el total general de precios de las unidades y descuentos de la tabla SalesOrderDetail: USE AdventureWorks Go SELECT SalesOrderID, UnitPrice, UnitPriceDiscount FROM Sales.SalesOrderDetail ORDER BY SalesOrderID COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount) -- obtiene la suma de unidades y el mximo de unidades vendidas use pubs go select stor_id, qty from sales order by stor_id compute sum(qty), max(qty) En la siguiente consulta se agrega la palabra clave opcional BY a la clusula COMPUTE para crear subtotales para cada pedido de ventas: USE AdventureWorks SELECT SalesOrderID, UnitPrice, UnitPriceDiscount FROM Sales.SalesOrderDetail ORDER BY SalesOrderID COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount) BY SalesOrderID Los resultados de esta instruccin SELECT devuelven dos conjuntos de resultados para cada pedido de ventas. El primer conjunto de resultados de cada pedido de ventas tiene un conjunto de filas que contienen la informacin especificada en la lista de seleccin. El segundo conjunto de resultados de cada pedido de ventas contiene los subtotales de las dos funciones SUM de la clusula COMPUTE. -Ahora se devuelve totales por cada tienda

use pubs go select stor_id, qty from sales

Bases de Datos

Ing. Rosa Navarrete

3
order by stor_id compute sum(qty), max(qty) by stor_id

COMPARAR COMPUTE CON GROUP BY A continuacin se resumen las diferencias entre COMPUTE y GROUP BY: GROUP BY produce un conjunto individual de resultados. Hay una fila por cada grupo que contiene slo las columnas de agrupamiento y las funciones de agregado que muestran el subagregado de ese grupo. La lista de seleccin slo contiene las columnas de agrupamiento y las funciones de agregado. COMPUTE produce varios conjuntos de resultados. Un tipo de conjunto de resultados contiene las filas de detalle de cada grupo que contiene las expresiones de la lista de seleccin. El otro tipo de conjunto de resultados contiene el subagregado de un grupo o el agregado total de la instruccin SELECT. La lista de seleccin puede contener expresiones que no sean las columnas de agrupacin o las funciones de agregado. Las funciones de agregado se especifican en la clusula COMPUTE, no en la lista de seleccin.

En la siguiente consulta se utiliza GROUP BY y funciones de agregado. La consulta devuelve un conjunto de resultados que tiene una fila por grupo que contiene los subtotales agregados para ese grupo: USE AdventureWorks SELECT SalesOrderID, SUM(UnitPrice), SUM(UnitPriceDiscount) FROM Sales.SalesOrderDetail GROUP BY SalesOrderID

Calcular totales de grupo mediante COMPUTE BY

En este ejemplo se utilizan dos fragmentos de cdigo para mostrar la utilizacin de COMPUTE BY. En el primer ejemplo de cdigo se utiliza un elemento COMPUTE BY con una funcin de agregado, mientras que en el segundo se utiliza un elemento COMPUTE BY y dos funciones de agregado. Esta consulta calcula la suma de los pedidos de aquellos productos cuyos precios son inferiores a $5.00 por cada tipo de producto.
USE AdventureWorks ; GO

Bases de Datos

Ing. Rosa Navarrete

4
SELECT ProductID, LineTotal FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 ORDER BY ProductID, LineTotal COMPUTE SUM(LineTotal) BY ProductID ; GO

Esta consulta recupera el tipo de producto y la cantidad de pedidos total para aquellos productos con precios inferiores a $5.00. La clusula COMPUTE BY utiliza dos funciones de agregado diferentes.
USE AdventureWorks ; GO SELECT ProductID, LineTotal FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 ORDER BY ProductID, LineTotal COMPUTE SUM(LineTotal), MAX(LineTotal) BY ProductID ; GO

Calcular valores totales mediante COMPUTE sin BY

Se puede utilizar la palabra clave COMPUTE sin BY para generar totales generales, recuentos totales, etc. En el siguiente ejemplo se obtiene el total general de los precios y anticipos de todos los tipos de productos cuyo precio es inferior a $2.00.
USE AdventureWorks ; GO SELECT ProductID, OrderQty, UnitPrice, LineTotal FROM Sales.SalesOrderDetail WHERE UnitPrice < $2.00 COMPUTE SUM(OrderQty), SUM(LineTotal) ;

Bases de Datos

Ing. Rosa Navarrete

5
GO

Puede utilizar COMPUTE BY y COMPUTE sin BY en la misma consulta. La siguiente consulta busca la suma de las cantidades de pedido y los totales de lnea por tipo de producto y, a continuacin, calcula el total de pedidos y lneas.
USE AdventureWorks ; GO SELECT ProductID, OrderQty, UnitPrice, LineTotal FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 ORDER BY ProductID COMPUTE SUM(OrderQty), SUM(LineTotal) BY ProductID COMPUTE SUM(OrderQty), SUM(LineTotal) ; GO

Calcular sumas en todas las filas

En el siguiente ejemplo se muestran slo tres columnas de la lista de seleccin y se proporcionan totales basados en todas las cantidades de pedido y todos los totales de lnea al final de los resultados.
USE AdventureWorks ; GO SELECT ProductID, OrderQty, LineTotal FROM Sales.SalesOrderDetail COMPUTE SUM(OrderQty), SUM(LineTotal) ; GO

Utilizar ms de una clusula COMPUTE

En el siguiente ejemplo se obtiene la suma de los precios de todos los pedidos cuyo precio es inferior a 5 $ organizada por Id. de producto y cantidad de pedido, as como la suma de los precios de todos los pedidos inferiores a 5 $ organizada nicamente por Id. de producto. Puede utilizar diferentes funciones de agregado en la misma instruccin si incluye ms de una clusula COMPUTE BY.
USE AdventureWorks ;

Bases de Datos

Ing. Rosa Navarrete

6
GO SELECT ProductID, OrderQty, UnitPrice, LineTotal FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 ORDER BY ProductID, OrderQty, LineTotal COMPUTE SUM(LineTotal) BY ProductID, OrderQty COMPUTE SUM(LineTotal) BY ProductID ;

Comparar GROUP BY con COMPUTE

En el primer ejemplo se utiliza la clusula COMPUTE para calcular la suma de todos los pedidos cuyo precio es inferior a $5.00 por tipo de producto. En el segundo ejemplo se genera la misma informacin de resumen slo mediante GROUP BY.
USE AdventureWorks ; GO SELECT ProductID, LineTotal FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 ORDER BY ProductID COMPUTE SUM(LineTotal) BY ProductID ; GO

sta es la segunda consulta que utiliza GROUP BY.


USE AdventureWorks ; GO SELECT ProductID, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 GROUP BY ProductID ORDER BY ProductID ; GO

Bases de Datos

Ing. Rosa Navarrete

Utilizar SELECT con las clusulas GROUP BY, COMPUTE y ORDER BY

En el siguiente ejemplo slo se devuelven aquellos pedidos cuyo precio es inferior a 5 $ y, a continuacin, se calcula la suma total de lnea por producto y el total general. Todas las columnas calculadas aparecen en la lista de seleccin.
USE AdventureWorks ; GO SELECT ProductID, OrderQty, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 GROUP BY ProductID, OrderQty ORDER BY ProductID, OrderQty COMPUTE SUM(SUM(LineTotal)) BY ProductID, OrderQty COMPUTE SUM(SUM(LineTotal)) ;

Bases de Datos

Ing. Rosa Navarrete

You might also like