Saltar la navegación

7.- Agrupamiento de registros.

Caso práctico

Un conjunto de personas aparecen juntas y ordenadas formando un grupo.
Stockbyte. (Uso educativo nc)



Juan ha estado realizando algunas consultas de resumen y ahora quiere continuar sacando todo el jugo posible a las tablas realizando operaciones como las anteriores pero agrupándolas por algún campo. Hay veces que se obtiene mucha información si estudiamos los datos por grupos, como puede ser el número de jugadores por provincia, o el saldo medio según el sexo del jugador para así poder obtener conclusiones sobre la información guardada.

Aplicación de la función que suma el crédito agrupando por provincia.
Oracle/Elaboración propia (Uso educativo nc)

Hasta aquí las consultas de resumen que hemos visto obtienen totales de todas las filas de un campo o una expresión calculada sobre uno o varios campos. Lo que hemos obtenido ha sido una única fila con un único dato.

Ya verás como en muchas ocasiones en las que utilizamos consultas de resumen nos va a interesar calcular totales parciales, es decir, agrupados según un determinado campo.

De este modo podríamos obtener de una tabla EMPLEADOS, en la que se guarda su sueldo y su actividad dentro de la empresa, el valor medio del sueldo en función de la actividad realizada en la empresa. También podríamos tener una tabla clientes y obtener el número de veces que ha realizado un pedido, etc.

En todos estos casos en lugar de una única fila de resultados necesitaremos una fila por cada actividad, cada cliente, etc.

Podemos obtener estos subtotales utilizando la cláusula GROUP BY. También podemos poner condiciones a esos grupos con la cláusula HAVING.

La sintaxis es la siguiente:

SELECT columna1, columna2, ...
FROM tabla1, tabla2, ...
[WHERE condición1, condición2, …]
[GROUP BY columna1, columna2, …
[HAVING condición ]]
[ORDER BY ordenación];

En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. En la cláusula HAVING se especifica la condición que han de cumplir los grupos para que se realice la consulta.

Es muy importante que te fijes bien en el orden en el que se ejecutan las cláusulas:

  1. WHERE que filtra las filas según las condiciones que pongamos.
  2. GROUP BY que crea una tabla de grupos nueva.
  3. HAVING filtra los grupos.
  4. ORDER BY que ordena o clasifica la salida.

Las columnas que aparecen en el SELECT y que no aparezcan en la cláusula GROUP BY deben tener una función de agrupamiento. Si esto no se hace así producirá un error. Otra opción es poner en la claúsula GROUP BY las mismas columnas que aparecen en SELECT.

Veamos un par de ejemplos:

SELECT provincia, SUM(credito) FROM Usuarios GROUP BY provincia;

Obtenemos la suma de créditos de nuestros usuarios agrupados por provincia. Si estuviéramos interesados en la suma de créditos agrupados por provincia pero únicamente de las provincias de Sevilla y Badajoz nos quedaría:

SELECT provincia, SUM(credito) FROM Usuarios 
GROUP BY provincia 
HAVING UPPER(provincia) = 'SEVILLA' OR UPPER(provincia)= 'BADAJOZ';


Autoevaluación

Relaciona cada cláusula con su orden de ejecución:
Ejercicio de relacionar
Cláusula. Relación. Función.
WHERE 1. PRIMERO
ORDER BY 2. SEGUNDO
HAVING 3. TERCERO
GROUP BY 4. CUARTO

Habilitar JavaScript

Ejercicio Resuelto

Utilizando las tablas y datos de la aplicación EMPRESA descargados

  1. Obtener, agrupando, por ciudad el salario medio de los empleados, siempre y cuando en esa ciudad (grupo) haya menos de 3 empleados.
  2. Obtener de la tabla HISTORIAL_LABORAL el número de empleados que ha trabajado en cada Departamento