La cláusulas GROUP BY y HAVING son muy útiles para consolidar y/o subtotalizar datos por alún criterio. Vamos a mirar un ejemplo para entender ambas cláusulas.
Supongamos que tenemos una base de datos del Desfile de Autos Clásicos y Antiguos de la Feria de las Flores de la ciudad de Medellín. El desfile se hace en forma anual. Los carros desfilan con una cantidad de ocupantes dentro de ellos.....
Para tal fin, se tiene almacenado en una tabla los atos principales de cada carro. | |
Y en otra tabla, llamada DESFILA, se tienes los datos de los años en que cada carro ha desfilado y cuantos ocupantes tenía. En la imagen podemos observar que el carro de placa AAA400, ha desfilado en los años 2015, 2018, 2020 y 2021, y en cada año tuvo una cantidad diferente de ocupantes. Cuando dicho carro desfiló en el 2015, tenía 2 ocupantes, cuando desfiló en el 2018 tenía un solo ocupante, etc. Es importante entender que un carro puede desfilar en varios años de la edición del desfile. |
|
Vamos a suponer que se necesita consultar la placa de cada carro, junto con la cantidad TOTAL de ocupantes que ha tenido en todos los años que ha desfilado. Para hacer esto, como se ve la imagen, se deben agrupar las tuplas de la tabla por placa, es decir, se arman grupos de tuplas de igual placa. Y dentro de cada grupo conformado, se hace una suma de los valores del campo CANTOCUP. De esta manera, vemos que el carro con placa AAA400 tuvo, en total, 13 ocupantes en todos los desfiles donde participo, el carro de placas CCC600 tuvo 12 ocupantes y el carro de placas EEE888 tuvo un solo ocupante.
|
|
La consulta se hace usando la cláusula GROUP BY. En el SELECT se imprime la placa y la suma de ocupantes de esa placa. Es de advertir que ambos datos se imprimen dentro de cada grupo conformado por la cláusula GROUP BY. Con la clausula GROUP BY se define cuál es el criterio para conformar los grupos de tuplas y, dentro de cada grupo, se imprime lo que hay en el SELECT. |
Por otra parte, para que entendamos la cláusula HAVING, supongamos la siguiente situación en el anterior ejemplo:
Tenemos los carros agrupados por placa, y ya sabemos en total, cuantos ocupantes tuvo cada carro. Ahora necesitamos consultar solo los carros cuya cantidad total de ocupantes es superior a 10. Como se puede apreciar en la imagen, de los tres carros, sólo dos van a ser mostrados en el resultado de la consulta. Para eso, hay que ponerle una condición a la estadística (SUM) obtenida por cada grupo de tuplas. |
|
Ahí es donde entra en escena la cláusula HAVING. La cláusula HAVING es utilizada para ponerle condiciones a la(s) estadística(s) calculada(s) por cada grupo de tuplas conformadas por GROUP BY. Como se puede observar, el HAVING está definiendo la condición de que la suma de ocupantes hecha por cada carro sea mayor a 10. Es importante decir que cuando la instrucción SELECT tiene un HAVING, es porque también hay un GROUP BY. Y como conclusión, es bueno mencionar que el HAVING le pone condiciones a grupos de tuplas, mientras que el WHERE le pone condiciones a tuplas individuales.
|
Video: