Compute in MySQL
Transcript of 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
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
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
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
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
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
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