Databases
T01-008-02 GROUP BY - HAVING
Enunciado
La cláusula
HAVINGpermite establecer criterios sobre las filas resultantes tras la aplicación de unGROUP BY.Sintaxis:
La cláusula
HAVINGla situaremosinmediatamente después del GROUP BY, ya que sus criterios se aplicarán sobre las filas generadas por el agrupamiento.
SELECT columna1, columna2, ...
FROM tabla1, tabla2, ...
WHERE condición1, condición2, …
GROUP BY columna1, columna2, …
HAVING condición1, condición2, …
ORDER BY ordenación;Es muy importante entender que, a partir de este momento, tenemos 2 lugares en los que se pueden establecer criterios de selección:
WHERE: sus criterios se evalúan antes de agrupar.HAVING: sus criterios se evalúan después de agrupar.Ejemplo:
En un ejemplo anterior, vimos como mostrar el salario medio de todos los empleados por departamentos. En esta ocasión, en lugar de utilizar a todos los departamentos para calcular el salario medio, vamos a utilizar únicamente a aquellos empleados cuyo trabajo contiene la palabra CLERK:
SELECT DEPARTMENT_ID, AVG(SALARY) AS "SALARIO MEDIO"
FROM HR.employees
WHERE JOB_ID LIKE '%CLERK%'
GROUP BY DEPARTMENT_ID
DEPARTMENT_ID SALARIO MEDIO 50 3000 30 2780 El criterio de que el trabajo de los empleados debe contener CLERK lo hemos tenido que poner en la cláusula
WHERE, ya que, como se puede observar, tras el agrupamiento, ya no disponemos del datoJOB_ID.En la cláusula HAVING, únicamente podríamos establecer criterios sobre los datos de los que dispongamos tras el agrupamiento, es decir, de los datos que aparecen en la tabla anterior. Por ejemplo, podríamos querer que únicamente se mostraran los departamentos en los que la media de los salarios de los empleados que realizan un trabajo que contiene CLERK fuera menor que 3000:
SELECT DEPARTMENT_ID, AVG(SALARY) AS "SALARIO MEDIO"
FROM HR.employees
WHERE JOB_ID LIKE '%CLERK%'
GROUP BY DEPARTMENT_ID
HAVING AVG(SALARY) < 3000
DEPARTMENT_ID SALARIO MEDIO 30 2780 Ejercicio:
Muestra el salario MÍNIMO y MÁXIMO de los empleados de cada uno de los tipos de trabajo existentes.
Excluye del agrupamiento aquellos en los que el MÍNIMO y el MÁXIMO son iguales.
Ordena el resultado alfabéticamente, en orden ASCENDENTE, según el tipo de trabajo.
Tipo
Solución
SELECT JOB_ID, MIN(SALARY) AS "SALARIO MINIMO", MAX(SALARY) AS "SALARIO MAXIMO"
FROM HR.employees
GROUP BY JOB_ID
HAVING MIN(SALARY) <> MAX(SALARY)
ORDER BY JOB_ID
Prueba
LibrerÃas (Onfly databases)

