En un artículo anterior ya hemos visto como se usa la cláusula WHERE. Su utilidad es que nos permite condicionar cuales filas de la tabla se mostrarán y cuales no. Hay una cláusula similar pero que se refiere solamente a las filas agrupadas: HAVING.
Así como WHERE involucra a todas las filas de una tabla, HAVING involucra a las filas obtenidas al ejecutar la cláusula GROUP BY. Veamos un ejemplo:
Captura 1. Hallando el total vendido en cada día
En la Captura 1. estamos viendo el total que se vendió en cada día. Pero ¿y si solamente queremos ver aquellas filas cuyo total sea mayor que 1.000? Para eso usaremos a la cláusula HAVING.
Captura 2. Mostrando las fechas cuyo total vendido es mayor que 1.000
Como ya habrás observado, en la Captura 2. solamente se encuentran las filas que obtuvimos en la Captura 1. y cuyos totales vendidos son mayores que 1.000
Por lo tanto, primero se obtienen los datos agrupados (los que se observan en la Captura 1.) y luego se le pone una condición a esos datos (como se puede ver en la Captura 2.)
Hay veces en que la condición se puede poner después de la cláusula WHERE o después de la cláusula HAVING, indistintamente.
Por ejemplo, si solamente queremos ver las fechas que corresponden al mes de febrero podríamos escribir:
WHERE MONTH(VTC_FECHAX) = 2
o también podríamos escribir:
HAVING MONTH(VTC_FECHAX) = 2
Aquí, escribir una u otra da lo mismo, se obtendrán exactamente los mismos resultados. Sin embargo, cuando usamos funciones agrupadas, no es lo mismo.
Captura 3. Escribir una función agrupada después del WHERE causa un error
Como en la condición se está usando una función agrupada, es obligatorio escribir esa condición después del HAVING, tal y como se puede ver en la Captura 2.
Desde luego que se puede tener una cláusula WHERE y también una cláusula HAVING. Por ejemplo, si solamente se desean ver las ventas del mes de febrero cuyos totales vendidos sean mayores que 1.000, se puede escribir:
Captura 4. Una condición en el WHERE y otra condición en el HAVING
En el WHERE se eligió el mes, en el HAVING que el total de las ventas diarias fuera mayor que 1.000, y tanto en uno como en otro caso se pueden usar los operadores lógicos AND, OR, NOT, IN, si fuera necesario.
Conclusión:
El uso de la cláusula HAVING es idéntico al uso de la cláusula WHERE, la diferencia radica en que mientras WHERE se refiere a todas las filas de la tabla, HAVING se refiere solamente a las filas obtenidas al agrupar con la cláusula GROUP BY.
Por eso, una práctica común es escribir un SELECT con un GROUP BY pero sin un HAVING. Después de observar el resultado obtenido se escribe la cláusula HAVING correspondiente. Si se la necesita, claro. ¿Y cuándo se la necesita? Cuando las filas obtenidas con la cláusula GROUP BY deben cumplir alguna condición.
En la Captura 2. esa condición fue que el Total de lo que se vendió en cada día sea mayor que 1000.
Si comparas la Captura 1. con la Captura 2. verás que en la Captura 2. solamente aparecieron las filas cuyo Total vendido fue mayor que 1000.
Tanto en el WHERE como en el HAVING se pueden poner condiciones extremadamente complejas, usando los operadores lógicos AND, OR, NOT, e IN.
En siguientes artículos de esta serie verás condiciones mucho más complejas que las que viste hasta ahora.
Artículos relacionados:
De DBF a SQL (1). Introducción
De DBF a SQL (2). Reemplazando comandos
De DBF a SQL (3). Entendiendo a los cursores
De DBF a SQL (4). Ejemplos de usar SELECT con una sola tabla
De DBF a SQL (5). Las funciones agrupadas
De DBF a SQL (6). Agrupando filas
De DBF a SQL (8). Ordenando las filas
De DBF a SQL (9). Uniendo tablas
De DBF a SQL (10). Obteniendo las primeras filas de una tabla
De DBF a SQL (11). Relacionando una tabla con otra tabla
De DBF a SQL (12). Relacionando una tabla consigo misma
De DBF a SQL (13). Relacionando a varias tablas entre sí
De DBF a SQL (14). Más sobre el uso de DISTINCT
De DBF a SQL (15). Usando subconsultas
De DBF a SQL (16). Más sobre las subconsultas
De DBF a SQL (17). Ejemplos de subconsultas
De DBF a SQL (19). Hallando los porcentajes sobre un total
De DBF a SQL (20). Los operadores especiales de comparación
De DBF a SQL (21). La técnica de los dos cursores
De DBF a SQL (22). Optimizando el uso del operador de comparación especial IN
De DBF a SQL (23). Usando la función CAST()
De DBF a SQL (24). Buscando texto
De DBF a SQL (25). Creando tablas y cursores
De DBF a SQL (26). INSERT, UPDATE, y DELETE, con subconsultas
De DBF a SQL (27). Entendiendo Cliente/Servidor
De DBF a SQL (28). Conectándose a un Servidor
De DBF a SQL (29). Las cadenas de conexión ODBC a los motores SQL más populares
De DBF a SQL (30). Conectándose mediante ADO a las bases de datos
De DBF a SQL (31). Optimizando la escritura de los SELECT
De DBF a SQL (32). Mejorando la estética de los SELECT
De DBF a SQL (33). Usando la función SQLEXEC()
De DBF a SQL (34). Enviándole parámetros a la función SQLEXEC()
El índice del blog VFPavanzado