Filtrar grupos usando HAVING en PostgreSQL

En este artículo vamos aprender a filtrar grupos usando HAVING en PostgreSQL. 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 está 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;
Filtrar grupos usando HAVING en PostgreSQL

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;

Escribir un comentario

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.