Resumir datos con COMPUTE y COMPUTE BY
Las cláusulas COMPUTE y COMPUTE BY se proporcionan por razones de compatibilidad con versiones anteriores. En su lugar, utilice los siguientes componentes:
- SQL Server 2005 Analysis Services (SSAS) con OLE DB para Analysis Services o Microsoft ActiveX Data Objects Multidimensional (ADO MD). Para obtener más información, vea Interfaces de acceso a datos de Analysis Services (Analysis Services - Datos multidimensionales).
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 cumple las condiciones de 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
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 AdventureWorks
SELECT SalesOrderID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID
COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount)
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.
[!NOTA]
En algunas utilidades, como osql, los diversos resúmenes agregados de totales o subtotales aparecen como si cada subtotal fuera una fila separada en un conjunto de resultados. Esto se debe a la forma en la que la herramienta da formato al resultado; los agregados subtotales o totales se devuelven en una fila. Otras aplicaciones, como SQL Server Management Studio, dan formato a varios agregados en la misma línea.
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
[!NOTA]
Los tipos de datos ntext, text o image no pueden incluirse en una cláusula COMPUTE o COMPUTE BY.