En este articulo vamos aprender a filtrar grupos usando HAVING en PostgreSQL. Esta cláusula se utiliza junto al GROUP BY ya que esta ultima 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)

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;

Ejemplo completo
Copia y pega el siguiente código en tu consola de PostgreSQL y realiza paso a paso leyendo los comentarios.
-- Borramos la tabla si existe drop table if exists 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','26/09/1986',60000), (2,1,'Ismael Troyano','Analista','01/01/2001',60000), (3,1,'Jose Troyano','Alta Dirección','01/01/2001',80000), (4,1,'Pilar Redondo','Alta Dirección','02/02/2002',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;