Unidad 5. Consultas de resumen (IV)


5.14. Agrupamiento de filas (cláusula GROUP BY).

Hasta ahora las consultas sumarias que hemos visto obtienen totales de todas las filas del origen y producen una única fila de resultado.

Muchas veces cuando calculamos resúmenes nos interesan totales parciales, por ejemplo saber de cada empleado cuánto ha vendido, y cuál ha sido su pedido máximo, de cada cliente cuándo fue la última vez que nos compró, etc.
En todos estos casos en vez de obtener una fila única de resultados necesitamos una fila por cada empleado, cliente, etc.

 Podemos obtener estos subtotales con la cláusula GROUP BY.


GROUP BY [ ALL ] expresion_agrupacion [ ,...n ]

   [ WITH { CUBE | ROLLUP } ]

Una consulta con una cláusula GROUP BY agrupa los datos de la tabla origen y produce una única fila resultado por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupación o agrupamiento .

Cuando queremos realizar una agrupación múltiple, por varias columnas, éstas se indican en la cláusula GROUP BY en el orden de mayor a menor agrupación igual que con la cláusula ORDER BY.

expresion_agrupacion 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.
No se pueden utilizar columnas de tipo text, ntext e image en expresion_agrupacion.

En las cláusulas GROUP BY que no contengan CUBE o ROLLUP, el número de columnas de agrupación 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.

Si en la columna de agrupación existen valores nulos, se generará una fila de resumen para este “valor”, en este caso se considera el valor nulo como otro valor cualquiera.

Ejemplo:


SELECT oficina, count(numemp) AS  [Número de empleados]

FROM empleados

GROUP BY oficina;

Resultado:

oficina Número de empleados
NULL 2
11 2
12 3
13 1
21 2
22 1

Hay empleados sin oficinas (con oficina a nulo), estos forman un grupo con el valor NULL en oficina, en este caso hay dos empleados así.

Podemos indicar varias columnas de agrupación.

Ejemplo:


SELECT rep, clie, count(numpedido) AS [Número de pedidos], MAX(importe)  AS [Importe máximo]

FROM pedidos

WHERE YEAR(fechapedido) = 1997

GROUP BY  rep, clie

ORDER BY rep, clie; 

Resultado:

rep clie Número
de pedidos
Importe
máximo
101 2113 1 225,00
102 2106 2 21,30
102 2120 1 37,50
103 2111 2 21,00
105 2103 4 275,00
105 2111 1 37,45
106 2101 1 14,58
107 2109 1 313,50
107 2124 2 24,30
108 2112 1 29,25
108 2114 1 71,00
108 2118 3 14,20

De cada representante obtenemos el número de pedidos y el importe máximo vendido a cada cliente, de las ventas de 1997. La cláusula ORDER BY se ha incluido para que las filas aparezcan ordenadas y quede más claro.

Febrero-2010
Pág. 5.4

Atrás  Inicio  Adelante






.