Databases

T01-008-02 GROUP BY - HAVING

Enunciado

La cláusula HAVING permite establecer criterios sobre las filas resultantes tras la aplicación de un GROUP BY.

Sintaxis:

La cláusula HAVING la situaremos inmediatamente 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 dato JOB_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

SELECT

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)