GROUP BY (Transact-SQL)
Actualizado: 17 de julio de 2006
Especifica los grupos en los que se deben colocar las filas de salida. Si se incluyen funciones de agregado en la <lista de selección> de la cláusula SELECT, GROUP BY calcula un valor de resumen para cada grupo. Cuando se especifica GROUP BY, cada columna que esté en una expresión no agregada de la lista de selección se debe incluir en la lista de GROUP BY o la expresión GROUP BY debe coincidir exactamente con la expresión de la lista de selección.
[!NOTA] Si no se especifica la cláusula ORDER BY, los grupos devueltos con la cláusula GROUP BY no están en un orden determinado. Se recomienda utilizar siempre la cláusula ORDER BY para especificar un orden determinado de los datos.
Convenciones de sintaxis de Transact-SQL
Sintaxis
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
]
Argumentos
ALL
Incluye todos los grupos y conjuntos de resultados, incluso aquéllos en los que no hay filas que cumplan la condición de búsqueda especificada en la cláusula WHERE. Cuando se especifica ALL, se devuelven valores NULL para las columnas de resumen de los grupos que no cumplen la condición de búsqueda. No puede especificar ALL con los operadores CUBE y ROLLUP.GROUP BY ALL no se admite en consultas que tienen acceso a tablas remotas si también hay una cláusula WHERE en la consulta.
group_by_expression
Es una expresión según la cual se realiza la agrupación; group_by_expression también se conoce como columna de agrupación. group_by expression puede ser una columna o una expresión no agregada que haga referencia a una columna devuelta por la cláusula FROM. Un alias de columna que esté definido en la lista de selección no puede utilizarse para especificar una columna de agrupamiento.[!NOTA] Las columnas de tipo text, ntext e image no se pueden utilizar en group_by_expression.
En las cláusulas GROUP BY que no contengan CUBE o ROLLUP, el número de elementos group_by_expression está limitado por los tamaños de columna de GROUP BY, las columnas de agregado y los valores de agregado que participan en la consulta. Este límite procede del límite de 8.060 bytes de la tabla de trabajo intermedia que se necesita para contener los resultados intermedios de la consulta. Se permite un máximo de 10 expresiones de agrupamiento cuando se especifica CUBE o ROLLUP.
No se pueden especificar métodos de tipos de datos xml directamente en group_by_expression. En su lugar, haga referencia a una función definida por el usuario que incluya métodos de tipos de datos xml, o haga referencia a una columna calculada que los utilice.
CUBE
Especifica que, además de las filas que normalmente proporciona GROUP BY, deben incluirse filas de resumen en el conjunto de resultados. Se devuelve una fila de resumen GROUP BY por cada posible combinación de grupo y subgrupo del conjunto de resultados. En el resultado se muestra una fila de resumen GROUP BY como NULL, pero se utiliza para indicar todos los valores. Utilice la función GROUPING para determinar si los valores NULL del conjunto de resultados son valores de resumen GROUP BY.El número de filas de resumen del conjunto de resultados se determina mediante el número de columnas que contiene la cláusula GROUP BY. Cada operando (columna) de la cláusula GROUP BY se enlaza según el agrupamiento NULL y se aplica el agrupamiento al resto de los operandos (columnas). Debido a que CUBE devuelve todas las combinaciones posibles de grupo y subgrupo, el número de filas es el mismo, independientemente del orden en que se especifiquen las columnas de agrupamiento.
ROLLUP
Especifica que, además de las filas que normalmente proporciona GROUP BY, se incluyen filas de resumen en el conjunto de resultados. Los grupos se resumen en un orden jerárquico, desde el nivel inferior del grupo hasta el superior. La jerarquía del grupo se determina por el orden en que se especifican las columnas de agrupamiento. Cambiar el orden de las columnas de agrupamiento puede afectar al número de filas generadas en el conjunto de resultados.Importante: Cuando se utiliza CUBE o ROLLUP no se admiten agregados Distinct, como AVG(DISTINCT column_name), COUNT(DISTINCT column_name) y SUM(DISTINCT column_name). Si se utilizan, el SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) de Microsoft devuelve un mensaje de error y cancela la consulta.
Ejemplos
A. Utilizar una cláusula GROUP BY simple
En el ejemplo siguiente se recupera el total de cada SalesOrderID
de la tabla SalesOrderDetail
.
USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;
B. Utilizar una cláusula GROUP BY con varias tablas
En el ejemplo siguiente se recupera el número de empleados de cada City
de la tabla Address
combinada con la tabla EmployeeAddress
.
USE AdventureWorks ;
GO
SELECT a.City, COUNT(ea.AddressID) EmployeeCount
FROM HumanResources.EmployeeAddress ea
INNER JOIN Person.Address a
ON ea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City ;
C. Utilizar una cláusula GROUP BY con una expresión
En el ejemplo siguiente se recuperan las ventas totales de cada año con la función DATEPART
. Debe incluirse la misma expresión en la lista de selección y en la cláusula GROUP BY
.
USE AdventureWorks ;
GO
SELECT DATEPART(yyyy,OrderDate) AS Year,
SUM(TotalDue) AS AverageOrderAmt
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate)
ORDER BY DATEPART(yyyy,OrderDate) ;
Vea también
Referencia
SELECT (Transact-SQL)
SELECT (cláusula de Transact-SQL)
Otros recursos
Resumir datos con CUBE
Resumir datos con ROLLUP
Ayuda e información
Obtener ayuda sobre SQL Server 2005
Historial de cambios
Versión | Historial |
---|---|
17 de julio de 2006 |
|
5 de diciembre de 2005 |
|