Las expresiones de la cláusula GROUP BY pueden contener columnas de las tablas, de las tablas derivadas o de las vistas de la cláusula FROM. No es necesario que aparezcan las columnas en la lista de <selección> de la cláusula SELECT.
Deben incluirse en la lista GROUP BY todas las columnas de la tabla o la vista de cualquier expresión no agregada de la lista de <selección>:
-
Están permitidas las siguientes instrucciones:
SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA, ColumnB
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA, ColumnB
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA + ColumnB
SELECT ColumnA + ColumnB + constant FROM T GROUP BY ColumnA, ColumnB
-
No están permitidas las siguientes instrucciones:
SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA + ColumnB
SELECT ColumnA + constant + ColumnB FROM T GROUP BY ColumnA + ColumnB.
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. Se conocen como agregados vectoriales.
Las filas que no cumplen las condiciones especificadas en la cláusula WHERE se quitan antes de realizar ninguna operación de agrupación.
La cláusula HAVING se usa junto con la cláusula GROUP BY para filtrar los grupos en el conjunto de resultados.
La cláusula GROUP BY no ordena el conjunto de resultados. En su lugar, use la cláusula ORDER BY para ordenarlo.
Si una columna de agrupamiento contiene varios valores NULL, todos ellos se consideran equivalentes y se colocan en un grupo individual.
No es posible usar GROUP BY con un alias para reemplazar el nombre de una columna en la cláusula AS, a menos que dicho alias sustituya a un nombre de columna en una tabla derivada de la cláusula FROM.
Los conjuntos de agrupación duplicados de una lista GROUPING SETS no se eliminan. Los conjuntos de agrupación duplicados se pueden generar especificando una expresión de columna más de una vez o incluyendo una expresión de columna también generada por una instrucción CUBE o ROLLUP en la lista GROUPING SETS.
Cuando se utiliza ROLLUP, CUBE y GROUPING SETS se admiten agregados Distinct, como AVG (DISTINCT column_name), COUNT (DISTINCT column_name) y SUM (DISTINCT column_name).
ROLLUP, CUBE y GROUPING SETS no se pueden especificar en una vista indexada.
GROUP BY o HAVING no se pueden usar directamente en columnas de ntext, text o image. Estas columnas se pueden usar como argumentos en funciones que devuelven un valor de otro tipo de datos, como SUBSTRING() y CAST().
No se pueden especificar métodos de tipos de datos xml directamente en <column_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.
Limitaciones de GROUP BY para GROUPING SETS, ROLLUP y CUBE
Limitaciones de la sintaxis
Los operadores GROUPING SETS no se pueden usar en la cláusula GROUP BY a menos que formen parte de una lista GROUPING SETS. Por ejemplo, no se admite GROUP BY C1, (C2,..., Cn) pero sí GROUP BY GROUPING SETS (C1, (C2, ..., Cn)).
Los operadores GROUPING SETS no se pueden usar dentro de GROUPING SETS. Por ejemplo, no se admite GROUP BY GROUPING SETS (C1, GROUPING SETS (C2, C3)).
Las palabras clave que no cumplen la norma ISO ALL, WITH CUBE y WITH ROLLUP no se pueden usar en una cláusula GROUP BY con las palabras clave ROLLUP, CUBE o GROUPING SETS.
Limitaciones de tamaño
En la cláusula simple GROUP BY, no hay ningún límite en cuanto al número de expresiones.
En una cláusula GROUP BY que utilice ROLLUP, CUBE o GROUPING SETS, el número máximo de expresiones es 32, y el número máximo de conjuntos de agrupación que se pueden generar es 4.096 (212). Los ejemplos siguientes producen un error debido a que la cláusula GROUP BY es demasiado compleja:
-
En los ejemplos siguientes se generan 8.192 (213) conjuntos de agrupamiento.
GROUP BY CUBE (a1, ..., a13)
GROUP BY a1, ..., a13 WITH CUBE
-
En el ejemplo siguiente se generan 4.097 (212 + 1) conjuntos de agrupamiento.
GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )
-
En el ejemplo siguiente también se generan 4.097 (212 + 1) conjuntos de agrupamiento. Los conjuntos de agrupamiento
CUBE () y () generan una fila de total general y los conjuntos de agrupamiento duplicados no se eliminan.
GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())
Compatibilidad con las características GROUP BY de ISO y ANSI SQL-2006
SQL Server 2008 admite todas las características GROUP BY incluidas en el estándar SQL-2006 con las excepciones sintácticas siguientes:
-
Los conjuntos de agrupamiento no se pueden usar en la cláusula GROUP BY a menos que formen parte de una lista GROUPING SETS explícita. Por ejemplo,
GROUP BY Column1, (Column2, ...ColumnN) se admite en el estándar, pero no en SQL Server. Se admite GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) o GROUP BY Column1, Column2, ... ColumnN. Éstos son equivalentes semánticamente al ejemplo de GROUP BY anterior. Con ello se evita la posibilidad de que GROUP BY Column1, (Column2, ...ColumnN) se pueda malinterpretar como GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)). Éste no es equivalente semánticamente.
-
No se pueden usar conjuntos de agrupamiento dentro de conjuntos de agrupamiento. Por ejemplo,
GROUP BY GROUPING SETS (A1, A2,…An, GROUPING SETS (C1, C2, ...Cn)) se admite en el estándar SQL-2006, pero no en SQL Server. SQL Server 2008 admite GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) o GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) ). Estos ejemplos son equivalentes semánticamente al primer ejemplo de GROUP BY y tienen una sintaxis más clara.
-
No se admite GROUP BY [ALL/DISTINCT] en una cláusula GROUP BY general ni con las construcciones GROUPING SETS, ROLLUP, CUBE, WITH CUBE o WITH ROLLUP. ALL es el valor predeterminado y es implícito.
Comparación de las características GROUP BY compatibles
En la tabla siguiente se describen las características de GROUP BY que son compatibles dependiendo de la versión de SQL Server y del nivel de compatibilidad de la base de datos.
|
Característica
|
SQL Server 2005 Integration Services
|
Nivel de compatibilidad 100 con SQL Server 2008
|
Nivel de compatibilidad 90 o menor con SQL Server 2008
|
|---|
|
Agregados DISTINCT
|
No se admite en WITH CUBE ni en WITH ROLLUP.
|
Se admite en WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBE o ROLLUP.
|
Igual que el nivel de compatibilidad 100 con SQL Server 2008.
|
|
Función definida por el usuario con un nombre CUBE o ROLLUP en la cláusula GROUP BY
|
Se admite la función definida por el usuario dbo.cube (arg1,...argN) o dbo.rollup (arg1,...argN) en la cláusula GROUP BY.
Por ejemplo:
|
No se admite la función definida por el usuario dbo.cube (arg1,...argN) o dbo.rollup (arg1,...argN) en la cláusula GROUP BY.
Por ejemplo:
SELECT SUM (x)
FROM T
GROUP BY dbo.cube(y)
Se devuelve el mensaje de error siguiente: "Sintaxis incorrecta cerca de la palabra clave 'cube'|'rollup'."
Para evitar este problema, reemplace dbo.cube por [dbo].[cube] o dbo.rollup por [dbo].[rollup].
Se admite el siguiente ejemplo:
SELECT SUM (x)
FROM T
GROUP BY [dbo].[cube](y)
|
Se admite la función definida por el usuario dbo.cube (arg1,...argN) o dbo.rollup (arg1,...argN) en la cláusula GROUP BY
Por ejemplo:
SELECT SUM (x)
FROM T
GROUP BY dbo.cube(y)
|
|
GROUPING SETS
|
No compatible
|
Compatible
|
Compatible
|
|
CUBE
|
No compatible
|
Compatible
|
No compatible
|
|
ROLLUP
|
No compatible
|
Compatible
|
No compatible
|
|
Total general, como GROUP BY ()
|
No compatible
|
Compatible
|
Compatible
|
|
Función GROUPING_ID
|
No compatible
|
Compatible
|
Compatible
|
|
Función GROUPING
|
Compatible
|
Compatible
|
Compatible
|
|
WITH CUBE
|
Compatible
|
Compatible
|
Compatible
|
|
WITH ROLLUP
|
Compatible
|
Compatible
|
Compatible
|
|
Eliminación de grupos duplicados de WITH CUBE o WITH ROLLUP
|
Compatible
|
Compatible
|
Compatible
|