Lección 7 - Agrupación de datos (SQL GROUP BY)

Curso SQL para principiantes


En esta lección vamos a continuar hablando de la totalización de datos, ya que esta es un caso particular de la agrupación de datos, es decir, cuando usted totaliza datos de una tabla, en realidad está totalizando datos dentro de un solo y único grupo. De ahí que todos los ejemplos de totalización mostrados en la lección anterior devuelvan una sola y única fila.

Si logró asimilar lo que expone la lección 6, usted puede responder a la pregunta: ¿cuantos empleados hay? La respuesta es en realidad el total de registros de un solo grupo que podemos llamar: empleados. Puede responder también a la pregunta: ¿cuantos hombres hay? La respuesta no deja de ser el total de registros de un solo grupo que podemos llamar: hombres. Y podríamos seguir totalizando datos así, construyendo consultas SQL que devuelven una sola fila con el total de un solo grupo de registros, de manera que para totalizar por ejemplo el número de empleados por edades, deberíamos construir tantas consultas como grupos o rango de edades queramos evaluar. No parece práctico, ¿no sería más razonable construir una sola consulta SQL que en lugar de devolver una sola fila con el total de un solo grupo, devolviese varias filas, una por cada grupo, donde cada fila exprese el total de su grupo?

Supongamos por ejemplo una clase de alumnos, usted puede preguntarse: ¿cuantos alumnos hay?, y la respuesta es un solo dato que hace referencia a un solo grupo que podemos llamar: alumnos. Ahora dividamos la clase en dos grupos de manera que uno lo formen las chicas y otro los chicos. Una vez formados los dos grupos puede preguntarse: ¿cuantos alumnos hay en cada uno?, y la respuesta son dos datos, uno para cada grupo. El resultado es en realidad una totalización por grupos. Primero usted establece los grupos por sexo y luego totaliza la cantidad de miembros de cada uno. Pues bien, el SQL permite agrupar totales mediante la cláusula: GROUP BY.

En la lección anterior se dijo que no tiene sentido acompañar campos de tabla con funciones de totalización en una misma consulta SQL. Esto es así, sin embargo existe una excepción: usted puede acompañar un campo de tabla con funciones de totalización si su propósito es agrupar totales por ese campo, en cuyo caso deberá construir una consulta SQL para ese fin. El número de grupos resultantes dependerá de los distintos valores que existen para ese campo en el grupo de registros seleccionado.

Cláusula GROUP BY
Tenemos nuestra ya conocida tabla EMPLEADOS:



Construyamos una consulta que nos devuelva el total de empleados por sexo. Esto se consigue con una nueva cláusula: GROUP BY, en consecuencia debemos añadir una cuarta pregunta a las preguntas de construcción:

  • ¿Qué datos nos piden?
    El número de empleados.

  • ¿Dónde están los datos?
    En la tabla empleados

  • ¿Qué requisitos deben cumplir los registros?
    Ninguno, necesitamos que intervengan todos los registros.

  • ¿Cómo debemos agrupar los datos?
    Por sexo.

Consulta SQL:
Código: Seleccionar todo
  select SEXO , count(*) as EMPLEADOS
    from EMPLEADOS
group by SEXO


Resultado:

Observe que el resultado de la consulta devuelve dos filas, una para los hombres y otra para las mujeres, cada fila indica el número de empleados de su grupo. Advierta como los grupos resultantes son dos porque los distintos valores del campo SEXO en los registros seleccionados son dos: "H" y "M".

En general, cuando acompañamos uno o más campos de tabla con funciones de totalización, estos campos deberán formar parte de la cláusula GROUP BY. Un campo por el que agrupamos puede omitirse en la cláusula SELECT, aunque entonces, como puede apreciarse en el próximo ejemplo, ignoramos a que grupo representa cada fila de resultado.

Código: Seleccionar todo
  select count(*) as EMPLEADOS
    from EMPLEADOS
group by SEXO


Resultado:

Pero si un campo aparece en la clausula SELECT junto con funciones de totalización, entonces debemos forzosamente agrupar por ese campo, o lo que es lo mismo, debe formar parte de la clausula GROUP BY.

* * *

La palabra clave DISTINCT
Este es un buen momento para hacer un paréntesis en la agrupación de datos y presentar la palabra clave: DISTINCT.
Con ella podemos eliminar filas redundantes de un resultado SQL, por lo que permite obtener los distintos valores de un campo existentes en una tabla o grupo de registros seleccionados.

Por ejemplo, ¿qué valores distintos existen en el campo SEXO de la tabla empleados?:
Código: Seleccionar todo
select distinct SEXO
  from EMPLEADOS


Resultado:


sugerencia: lleve la anterior consulta SQL al banco de pruebas, eleminé la palabra clave distinct y ejecute la consulta.


Si al hacer DISTINCT en una consulta SQL sobre un campo el motor SQL devuelve por ejemplo dos filas, entonces al agrupar por ese campo un cálculo de totalización también devolverá dos filas, obviamente ambas consultas deben tener la misma cláusula WHERE, es decir, deben operar sobre el mismo grupo de registros.

En general pondremos la palabra clave DISTINCT delante de la lista de campos de la cláusula SELECT para eliminar las filas de resultados duplicadas o redundantes.
Código: Seleccionar todo
select distinct campo_1 , campo_2 , ... , campo_n
  from tabla


* * *

Para seguir viendo el potentísimo recurso SQL que es la agrupación de datos, vamos a suponer que usted gestiona un centro de acogida de mascotas, a él llegan perros y gatos abandonadas o de gente que no puede hacerse cargo. Para cada nueva mascota que llega al centro creamos un nuevo registro en la tabla MASCOTAS. Cuando una mascota es acogida por alguien, damos el registro de baja para indicar que esa mascota ha abandonado el centro.

Diseño de la tabla MASCOTAS:

Descripción de los campos:
  • ID_MASCOTA: Número o identificador de mascota.
  • NOMBRE: Nombre de la mascota.
  • ESPECIE: Campo codificado donde se guarda "P" para perro y "G" para gato.
  • SEXO: Campo codificado donde se guarda "M" para macho y "H" para hembra.
  • UBICACION: Jaula o estancia donde está ubicada la mascota.
  • ESTADO: Campo codificado donde se guarda "A" para alta en el centro y "B" para baja en el centro.

Echemos un vistazo a la tabla MASCOTAS:


Planteemos la siguiente cuestión: ¿cuantos perros de cada sexo hay en total actualmente en el centro?
Para construir la consulta SQL nos ayudamos de las preguntas de construcción:
  • ¿Qué datos nos piden?
    El número de perros.

  • ¿Dónde están los datos?
    En la tabla mascotas

  • ¿Qué requisitos deben cumplir los registros?
    Deben ser perros y estar de alta en el centro.

  • ¿Cómo debemos agrupar los datos?
    Por sexo.

Consulta SQL:
Código: Seleccionar todo
  select SEXO,count(*) as PERROS_VIGENTES
    from MASCOTAS
   where ESPECIE 
= 'P' and ESTADO = 'A'
group by SEXO


Resultado:

El resultado son dos machos y cinco hembras.

* * *

Más ejemplos: ¿Cuantos ejemplares contiene actualmente cada jaula o ubicación?

  • ¿Qué datos nos piden?
    El numero de ejemplares.

  • ¿Dónde están los datos?
    En la tabla mascotas

  • ¿Qué requisitos deben cumplir los registros?
    las mascotas deben estar de alta en el centro.

  • ¿Cómo debemos agrupar los datos?
    Por ubicación.

Consulta SQL:
Código: Seleccionar todo
  select UBICACION , count(*) as EJEMPLARES
    from MASCOTAS
   where ESTADO 
= 'A'
group by UBICACION


Resultado:

Obsérvese como en este caso la consulta SQL devuelve cinco filas, o lo que es lo mismo, cinco grupos resultantes. Esto es debido a que el campo UBICACIÓN contiene cinco distintos valores de entre los registros seleccionados.


* * *

Veamos ahora un ejemplo donde se agrupa por dos campos. Supongamos la siguiente cuestión: ¿cuantos ejemplares de cada especie, y dentro de cada especie de cada sexo, hay actualmente en el centro?
Para construir la consulta SQL nos ayudamos de las preguntas de construcción:
  • ¿Qué datos nos piden?
    El número de ejemplares.

  • ¿Dónde están los datos?
    En la tabla mascotas

  • ¿Qué requisitos deben cumplir los registros?
    Deben estar de alta en el centro.

  • ¿Cómo debemos agrupar los datos?
    Por especie y por sexo.

Consulta SQL:
Código: Seleccionar todo
  select ESPECIE , SEXO , count(*) as EJEMPLARES_VIGENTES
    from MASCOTAS
   where ESTADO 
= 'A'
group by ESPECIE , SEXO


Resultado:

El resultado son dos machos y cinco hembras para los perros, y tres machos y dos hembras para los gatos.

* * *

Pongamos otro ejemplo, pero esta vez planteémoslo al revés: ¿Qué devuelve la siguiente consulta SQL?:

Consulta SQL:
Código: Seleccionar todo
  select UBICACION , ESPECIE ,  SEXO , count(*) as EJEMPLARES_VIGENTES
    from MASCOTAS
   where ESTADO 
= 'A'
group by UBICACION , ESPECIE , SEXO


Resultado:

Observamos que el resultado de la consulta anterior devuelve datos totalizados en tres grupos, responde al número de ejemplares por especie y sexo que hay en cada ubicación.

* * *

Resumen
La cláusula GROUP BY permite obtener totales, mediante las funciones de totalización SUM, COUNT, MAX..., por grupos.
Los grupos resultantes dependen de los distintos valores que contengan, de entre los registros seleccionados, el campo o campos por los que se está agrupando . Si por ejemplo estamos agrupando por SEXO, los grupos resultantes serán como máximo dos, a no ser que consideremos hermafrodita como un tercer sexo, en cuyo caso serán tres.

Cuando acompañamos un campo de tabla con funciones de totalización, se debe forzosamente agrupar por ese campo, de modo que el campo debe formar parte de la cláusula GROUP BY.

* * *

Ejercicio 1
Construya una consulta que devuelva el salario medio, máximo y mínimo de los empleados agrupado por sexo.

Ejercicio 2
Construya una consulta que devuelva cuantos perros y cuantos gatos han pasado por el centro y ya no están.

Ejercicio 3
Construya una consulta que devuelva cuantos perros macho hay actualmente en el centro agrupado por ubicación.

Ejercicio 4
Con ayuda del filtro DISTINCT, construya una consulta que devuelva las diferentes especies que hay actualmente en cada jaula o ubicación del centro.




    Lección 6 - Totalizar datos / Alias de campos (SQL AS)
  • Lección 8 - Filtrar cálculos de totalización (SQL HAVING)

Creative Commons License Creative Commons License

Este curso está sujeto a la licencia Reconocimiento-NoComercial-SinObraDerivada 3.0 de Creative Commons. Usted puede copiarla, distribuirla y comunicarla públicamente siempre que especifique su autor y deletesql.com; no la utilice para fines comerciales; y no haga con ella obra derivada. Puede usted consultar la licencia completa aquí.




Volver a Curso SQL desde cero

¿Quién está conectado?

Usuarios navegando por este Foro: Google Adsense [Bot] y 8 invitados