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:
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