EJEMPLOS: GROUP BY

Listado de todas las carreras con la cantidad de materias correspondientes
SELECT
ca_nombre,
cantidad=COUNT(*)
FROM
Carreras c,
MateriasXCarreras m
WHERE
c.ca_id = m.ca_id
GROUP BY
ca_nombre

Listar cantidad de materias por carrera distinguiendo por año de cursado y por cuatrimestre
SELECT
ca_nombre,
mc_año,
mc_cuat
cantidad=COUNT(*)
FROM
Carreras c,
MateriasXCarreras m
WHERE
c.ca_id = m.ca_id
GROUP BY
ca_nombre,
mc_año,
mc_cuat

El siguiente material es tomado textualmente de Books On Line de Microsoft SQL Server

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

En este ejemplo se devuelve el número de unidades vendidas de cada producto de la categoría 2:

SELECT OrdD.ProductID AS ProdID,
SUM(OrdD.Quantity) AS AmountSold
FROM [Order Details] AS OrdD , Products as Prd
WHERE OrdD.ProductID = Prd.ProductID
AND Prd.CategoryID = 2
GROUP BY OrdD.ProductID

Éste es el conjunto de resultados:

ProdID AmountSold
------ -----------
3........ 328
4........ 453
5........ 298
6........ 301
8........ 372
15....... 122
44....... 601
61....... 603
63....... 445
65....... 745
66....... 239
77....... 791

(12 row(s) affected)

A continuación de las palabras clave GROUP BY se coloca una lista de columnas, conocidas como las columnas de agrupamiento. La cláusula GROUP BY restringe las filas del conjunto de resultados y sólo hay una fila por cada valor distinto de las columnas o columna de agrupamiento. Cada fila del conjunto de resultados contiene los datos de resumen relacionados con el valor específico de sus columnas de agrupamiento.

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

  • Las columnas de agrupamiento.
  • Expresiones que devuelven un solo valor por cada valor de las columnas de agrupamiento, como, 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:

ColumnAColumnBColumnC
---------------------
1abc5
1def4
1ghi9
2jkl8
2mno3

Si ColumnA se usa como la columna de agrupamiento, habrá dos filas en el conjunto de resultados, una que resuma la información del valor 1 y la otra que resuma la información del valor 2.

Cuando la ColumnA es la columna de agrupamiento, la única forma en la que se podría hacer referencia a la ColumnB o ColumnC es en el caso de que fueran parámetros de una función de agregado que pudiera devolver un valor único por cada valor de ColumnA. La lista de selección puede incluir expresiones como, por ejemplo, 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 exclusivo 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 en ColumnA, no hay forma de devolver los tres valores de ColumnB (abc, def y ghi) asociados con el valor 1 de ColumnA.

No hay comentarios.: