De DBF a SQL (7). Poniéndoles condiciones a los grupos

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:

GB10

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 (18). Paginación

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