2.5.5. Consultas con agrupacion de filas de una tabla

Las cláusulas siguientes, añadidas a la instrucción SELECT FROM, permiten organizar las filas por grupos:

a)  La cláusula GROUP BY nos sirve para agrupar filas según las columnas que indique esta cláusula.

b)  La cláusula HAVING especifica condiciones de búsqueda para grupos de filas; lleva a cabo la misma función que antes cumplía la cláusula WHERE para las filas de toda la tabla, pero ahora las condiciones se aplican a los grupos obtenidos.

Presenta el siguiente formato:

SELECT nombre_columnas_a seleccionar
FROM tabla_a_consultar
[WHERE condiciones]
GROUP BY columnas_según_las_cuales_se_quiere_agrupar
[HAVING condiciones_por_grupos]
[ORDER BY columna_ordenación [DESC] [, columna [DESC]...]];

 

 

Factores de agrupación
Los factores de agrupación de la cláusula GROUP BY deben ser, como mínimo, las columnas que figuran en SELECT, exceptuando las columnas afectadas, por funciones de agregación.

Notemos que en las sentencias SQL se van añadiendo cláusulas a medida que la dificultad o la exigencia de la consulta lo requiere.

 

Consulta con agrupación de filas en BDUOC

 

Imaginemos que queremos saber el sueldo medio que ganan los empleados de cada departamento:

SELECT nombre_dep, ciudad_dep, AVG(sueldo) AS sueldo_medio
FROM empleados
GROUP BY nombre_dep, ciudad_dep;

El resultado de esta consulta sería:

nombre_dep ciudad_dep sueldo_dep
DIR Barcelona 90.000
DIR Girona 100.000
DIS Lleida 70.000
DIS Barcelona 70.000
PROD Tarragona 33.000
NULL NULL 40.000
num_proyec
4

Ejemplo de uso de la función de agregación SUM 

DISTINCT Y GROUP BY

En este ejemplo no es necesario poner DISTINCT, a pesar de que la columna num_proyec no es atributo identificador.
Fijémonos en que en la tabla empleados hemos puesto que todos los proyectos tienen el mismo código juntos en el mismo grupo y no es posible que aparezcan repetidos.

Veamos un ejemplo de uso de una función de agregación SUM del SQL que aparece en la cláusula HAVING de GROUP BY: “Queremos saber los códigos de los proyectos en los que la suma de los sueldos de los empleados es mayor que 180.000 euros”: 

 

 

 

 

 

 

 

 

SELECT num_proyec
FROM empleados
GROUP BY num_proyec
HAVING SUM (sueldo) >1.8E+5;

El resultado de esta consulta sería el que se ve al margen.