Agrupar filas con GROUP BY

La cláusula GROUP BY se usa para generar valores de agregado para cada fila del conjunto de resultados. Cuando se usan sin una cláusula GROUP BY, las funciones de agregado sólo devuelven un valor de agregado para una instrucción SELECT.

En el ejemplo siguiente se calcula el total de cada pedido de ventas de la base de datos.

USE AdventureWorks;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;
GO

Después de las palabras clave GROUP BY aparece una lista de columnas, conocidas como las columnas de agrupación. La cláusula GROUP BY restringe las filas del conjunto de resultados; sólo hay una fila por cada valor distintivo de las columnas de agrupación. Cada fila del conjunto de resultados contiene los datos de resumen relacionados con el valor específico de sus columnas de agrupación.

Los elementos que se pueden especificar en la lista de selección cuando una instrucción SELECT contiene una cláusula GROUP BY están restringidos. Los elementos permitidos en la lista de selección son los siguientes:

  • Las columnas de agrupación.
  • Expresiones que devuelven un solo valor por cada valor de las columnas de agrupación, por ejemplo, las funciones de agregado que tienen un nombre de columna como uno de sus parámetros. Se conocen como agregados vectoriales.

Por ejemplo, TableX contiene lo siguiente:

ColumnA ColumnB ColumnC

-------

-------

-------

1

abc

5

1

def

4

1

ghi

9

2

jkl

8

2

mno

3

Si ColumnA es la columna de agrupación, habrá dos filas en el conjunto de resultados, una que resume la información del valor 1 y otra que resume la del valor 2.

Cuando ColumnA es la columna de agrupación, la única forma en la que se puede hacer referencia a ColumnB o ColumnC es en el caso de que sean parámetros de una función de agregado que pueda devolver un valor único para cada valor de ColumnA. La lista de selección puede incluir expresiones como MAX(ColumnB), SUM(ColumnC) o AVG(ColumnC):

SELECT ColumnA,
       MAX(ColumnB) AS MaxB,
       SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA

Esta selección devuelve dos filas, una por cada valor único de ColumnA:

ColumnA     MaxB SumC        
----------- ---- ----------- 
1           ghi  18          
2           mno  11          

(2 row(s) affected)

Sin embargo, no se permite tener sólo la expresión ColumnB en la lista de selección:

SELECT ColumnA,
       ColumnB,
       SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA

Puesto que GROUP BY sólo puede devolver una fila con el valor 1 de ColumnA, no hay forma de devolver los tres valores de ColumnB (abc, def y ghi) asociados al valor 1 de ColumnA.

No es posible utilizar GROUP BY o HAVING en las columnas ntext, text, image o bit, a menos que se encuentren en una función que devuelva un valor con otro tipo de datos. Dos ejemplos de estas funciones son SUBSTRING y CAST.

Vea también

Otros recursos

CAST y CONVERT (Transact-SQL)
SUBSTRING (Transact-SQL)
SELECT (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005