Uso de CASE como si fuese GROUP BY

AUTORA: María González García

Al realizar cálculos sobre agrupaciones de tuplas según los valores de un campo, podemos plantearnos esta cuestión: ¿deberíamos utilizar GROUP BY o CASE?

Aunque GROUP BY es generalmente la opción más directa y eficiente para agrupar y calcular datos, existen situaciones donde CASE puede ofrecer una flexibilidad única y su uso se vuelva necesario. Por otra parte, dicha elección también puede depender de las necesidades visuales o preferencias de formato del resultado a obtener, ya que cada método ofrece una presentación y organización de los datos distinta.

Primer ejemplo. Cuando puedo elegir.

Supongamos que disponemos de la siguiente tabla con datos de personas

Persona
+----+-------------+--------+--------+
| id | nombre      | genero | altura |
+----+-------------+--------+--------+
|  1 | Ana Abad    | F      |   1.64 |
|  2 | Bea Bez     | F      |   1.60 |
|  3 | Carlos Cruz | M      |   1.75 |
|  4 | Edu Díaz    | M      |   1.77 |
+----+-------------+--------+--------+

Vamos a calcular las medias de las alturas por género.

Con CASE:

select avg(case when genero = 'F' then altura end) as altura_femenina_media,
       avg(case when genero = 'M' then altura end) as altura_masculina_media
from Persona;

Con GROUP BY:

En este caso, utilizar GROUP BY simplifica la consulta.

select genero, avg(altura) as altura_media
from persona
group by genero;

En ambos casos obtenemos la misma información, sin embargo, la disposición y el número de filas y columnas de las tablas obtenidas varían:

Con CASE vemos los dos resultados en una misma fila:

+-----------------------+------------------------+
| altura_femenina_media | altura_masculina_media |
+-----------------------+------------------------+
|                  1.62 |                   1.76 |
+-----------------------+------------------------+

Con GROUP BY vemos los resultados en varias filas:

+--------+--------------+
| genero | altura_media |
+--------+--------------+
| F      |         1.62 |
| M      |         1.76 |
+--------+--------------+

Conclusión: en este caso, nos decantaremos por una solución u otra en función de nuestras preferencias o los requisitos de formato del resultado.

Segundo ejemplo. Cuando no puedo elegir.

Calculemos la diferencia entre la altura media de los hombres y de las mujeres.

Para poder hacer la diferencia de alturas, es necesario que ambos valores (la altura media de hombres y mujeres) estén en la misma fila. Hay que darse cuenta de que SQL permite evaluar expresiones sobre valores de una misma tupla, pero no podemos hacer operaciones con valores de distintas tuplas.

Por ello, en este caso, el uso de CASE en funciones de agregación es imprescindible:

BIEN
select ( avg(case when genero = 'M' then altura end) -
         avg(case when genero = 'F' then altura end) ) as dif_altura_media
from Persona;

No hay comentarios:

Publicar un comentario