En este artículo vamos aprender a filtrar grupos usando HAVING en Oracle. Esta cláusula se utiliza junto al GROUP BY, ya que esta última crea los grupos y HAVING los filtra.
Sintaxis
La cláusula HAVING se escribe después de la cláusula GROUP BY, seguida de la cláusula debes poner la condición que se debe cumplir para filtrar los grupos. La sintaxis básica es:
select campo, agregacion(campo2)
from nombreTabla
where condicion
group by campo
having condicion
order by campo;
La cláusula HAVING no admite alias del SELECT o la posición de los campos en el SELECT, se debe escribir la función de agregación completa.
WHERE o HAVING
Entre el WHERE y el HAVING hay principalmente una diferencia. WHERE no permite funciones de agregación y HAVING sí. Ambas se utilizan para filtrar pero una filtra registros y otra filtra grupos.
Ejemplos
Usaremos la siguiente tabla llamada empleados para realizar los ejemplos (al final de la página esta disponible el script para crearla)
![](https://www.migueltroyano.com/wp-content/uploads/2023/12/oracle_describre_empleados.png)
Filtrar un grupo
La forma de filtrar un grupo más habitual es escribir en el SELECT y GROUP BY todos los campos por los que se quiera agrupar y escribir en el SELECT un campo con una función de agregación. Finalmente se escribe la cláusula HAVING con la función de agregación y la condición:
select nombre, sum(sueldo) as c1
from empleados
group by nombre
having sum(sueldo) > 70000;
![Filtrar grupos usando HAVING en Oracle](https://www.migueltroyano.com/wp-content/uploads/2023/12/oracle_having.png)
Ejemplo completo
Copia y pega el siguiente código en tu consola de Oracle y realiza paso a paso leyendo los comentarios.
-- www.MiguelTroyano.com
-- Borramos la tabla si existe
drop table empleados;
-- Creamos la tabla
create table empleados
(
id_empleado numeric(2,0),
id_departamento numeric(2,0),
nombre character varying(50),
puesto character varying(50),
fecha_alta date,
sueldo integer
);
-- Insertamos valores
insert into empleados values (1,1,'Miguel Troyano','Analista',to_date('26/09/1986','DD/MM/YYYY'),60000);
insert into empleados values (2,1,'Ismael Troyano','Analista',to_date('01/01/2001','DD/MM/YYYY'),60000);
insert into empleados values (3,1,'Jose Troyano','Alta Dirección',to_date('01/01/2001','DD/MM/YYYY'),80000);
insert into empleados values (4,1,'Pilar Redondo','Alta Dirección',to_date('02/02/2002','DD/MM/YYYY'),80000);
-- Mostramos la suma del sueldo de la tabla empleados
-- agrupado por nombre cuando la suma sea mayor de 70000
select nombre, sum(sueldo) as c1
from empleados
group by nombre
having sum(sueldo) > 70000;