Compute in MySQL

8
BASES DE DATOS Cláusulas COMPUTE y COMPUTE BY Una cláusula COMPUTE BY permite ver las filas de detalle y de resumen con una instrucción SELECT. Puede calcular valores de resumen para subgrupos, o un valor de resumen para el conjunto completo de resultados. La cláusula COMPUTE toma la siguiente información: La palabra clave opcional BY. Calcula el agregado de fila especificado en una base por columna. Un nombre de función de agregado de fila. Incluye SUM, AVG, MIN, MAX o COUNT. Una columna en la que realizar la función 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 cláusula COMPUTE son como un informe de interrupción 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 también puede calcular más de una función de agregado para el mismo grupo. Cuando se especifica COMPUTE con la cláusula opcional BY, hay dos conjuntos de resultados por cada grupo que califica la instrucción SELECT: El primer conjunto de resultados de cada grupo tiene el conjunto de filas de detalles que contienen la información de la lista de selección 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 cláusula COMPUTE para ese grupo. Cuando se especifica COMPUTE sin la cláusula opcional BY, hay dos conjuntos de resultados para la instrucción SELECT: Bases de Datos Ing. Rosa Navarrete 1

Transcript of Compute in MySQL

Page 1: Compute in MySQL

BASES DE DATOS

Cláusulas COMPUTE y COMPUTE BY

Una cláusula COMPUTE BY permite ver las filas de detalle y de resumen con una instrucción SELECT. Puede calcular valores de resumen para subgrupos, o un valor de resumen para el conjunto completo de resultados.

La cláusula COMPUTE toma la siguiente información:

La palabra clave opcional BY. Calcula el agregado de fila especificado en una base por columna.

Un nombre de función de agregado de fila. Incluye SUM, AVG, MIN, MAX o COUNT.

Una columna en la que realizar la función 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 cláusula COMPUTE son como un informe de interrupción 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 también puede calcular más de una función de agregado para el mismo grupo.

Cuando se especifica COMPUTE con la cláusula opcional BY, hay dos conjuntos de resultados por cada grupo que califica la instrucción SELECT:

El primer conjunto de resultados de cada grupo tiene el conjunto de filas de detalles que contienen la información de la lista de selección 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 cláusula COMPUTE para ese grupo.

Cuando se especifica COMPUTE sin la cláusula opcional BY, hay dos conjuntos de resultados para la instrucción SELECT:

El primer conjunto de resultados de cada grupo tiene todas las filas de detalles que contienen información de la lista de selección.

El segundo conjunto de resultados tiene una fila que contiene los totales de las funciones de agregado especificadas en la cláusula COMPUTE.

EJEMPLOS QUE UTILIZAN COMPUTE

Bases de Datos Ing. Rosa Navarrete

1

Page 2: Compute in MySQL

En la siguiente instrucción SELECT se utiliza una cláusula COMPUTE simple para crear el total general de precios de las unidades y descuentos de la tabla SalesOrderDetail:

USE AdventureWorksGo

SELECT SalesOrderID, UnitPrice, UnitPriceDiscountFROM Sales.SalesOrderDetailORDER BY SalesOrderIDCOMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount)

-- obtiene la suma de unidades y el máximo 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 cláusula 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 instrucción 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 información especificada en la lista de selección. El segundo conjunto de resultados de cada pedido de ventas contiene los subtotales de las dos funciones SUM de la cláusula COMPUTE.

-- Ahora se devuelve totales por cada tienda

use pubs

go

select stor_id, qty

from sales

Bases de Datos Ing. Rosa Navarrete

2

Page 3: Compute in MySQL

order by stor_id

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

COMPARAR COMPUTE CON GROUP BY

A continuación 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 sólo las columnas de agrupamiento y las funciones de agregado que muestran el subagregado de ese grupo. La lista de selección sólo 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 selección. El otro tipo de conjunto de resultados contiene el subagregado de un grupo o el agregado total de la instrucción SELECT. La lista de selección puede contener expresiones que no sean las columnas de agrupación o las funciones de agregado. Las funciones de agregado se especifican en la cláusula COMPUTE, no en la lista de selección.

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 código para mostrar la utilización de COMPUTE BY. En el primer ejemplo de código se utiliza un elemento COMPUTE BY con una función 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

SELECT ProductID, LineTotal

Bases de Datos Ing. Rosa Navarrete

3

Page 4: Compute in MySQL

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 cláusula 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) ;

GO

Bases de Datos Ing. Rosa Navarrete

4

Page 5: Compute in MySQL

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 línea por tipo de producto y, a continuación, calcula el total de pedidos y líneas.

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 sólo tres columnas de la lista de selección y se proporcionan totales basados en todas las cantidades de pedido y todos los totales de línea al final de los resultados.

USE AdventureWorks ;

GO

SELECT ProductID, OrderQty, LineTotal

FROM Sales.SalesOrderDetail

COMPUTE SUM(OrderQty), SUM(LineTotal) ;

GO

Utilizar más de una cláusula 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 instrucción si incluye más de una cláusula COMPUTE BY.

USE AdventureWorks ;

GO

Bases de Datos Ing. Rosa Navarrete

5

Page 6: Compute in MySQL

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 cláusula 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 información de resumen sólo 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

Utilizar SELECT con las cláusulas GROUP BY, COMPUTE y ORDER BY

Bases de Datos Ing. Rosa Navarrete

6

Page 7: Compute in MySQL

En el siguiente ejemplo sólo se devuelven aquellos pedidos cuyo precio es inferior a 5 $ y, a continuación, se calcula la suma total de línea por producto y el total general. Todas las columnas calculadas aparecen en la lista de selección.

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

7