Tener muy en cuenta:
- No puede utilizar la cláusula WHERE para restringir grupos.
- Utilice la cláusula HAVING para restringir grupos.
- No puede utilizar funciones de grupo en la cláusula WHERE.
SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id ;
ERROR at line 3:
ORA-00934: group function is not allowed here
Puede corregir el error del ejemplo
si utiliza la cláusula HAVING para restringir grupos.
SELECT department_id, AVG(salary)
FROM employees
HAVING AVG(salary) > 8000
GROUP BY department_id ;
Restricción de Resultados de Grupos
De la misma forma que utiliza la cláusula WHERE para restringir las filas que se seleccionarán, utilice la cláusula HAVING para restringir grupos. Para buscar el salario máximo de cada departamento que tenga un salario máximo superior a 10.000 dólares, necesita:
1. Buscar el salario medio de cada departamento agrupando por número de departamento.
2. Restringir los grupos a los departamentos con un salario máximo superior a 10.000 dólares.
Si se utiliza la cláusula HAVING, Oracle Server restringe los grupos así:
1. Se agrupan las filas.
2. Se aplica la función de grupo.
3. Se muestran los grupos que satisfacen la cláusula HAVING.
Restricción de Resultados de Grupos con la Cláusula HAVING
Utilice la cláusula HAVING para especificar los grupos que se deben mostrar, con los que se restringen más los grupos basándose en la información de agregación.
En la sintaxis, group_condition restringe los grupos de filas devueltas a los grupos para los que es verdadera la condición especificada.
Oracle Server sigue estos pasos si se utiliza la cláusula HAVING:
1. Se agrupan las filas.
2. Se aplica al grupo la función de grupo.
3. Se muestran los grupos que satisfacen los criterios de la cláusula HAVING.
La cláusula HAVING puede ir delante de la cláusula GROUP BY, pero se recomienda poner primero la cláusula GROUP BY, porque resulta más lógico. Se forman los grupos y se calculan las funciones de grupo antes de que se aplique la cláusula HAVING a los grupos de la lista SELECT.
SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary);
El ejemplo muestra el identificador de trabajo y el salario mensual total de cada trabajo que tiene una nómina total superior a 13.000 dólares. El ejemplo excluye a los representantes de venta y ordena la lista por salario mensual total.
0 comentarios:
Publicar un comentario