Agrupar registros usando GROUP BY en PostgreSQL

En este artículo vamos aprender a agrupar registros usando GROUP BY en PostgreSQL de una tabla. Esta cláusula divide en grupos las filas devueltas por el SELECT. Para cada grupo puedes utilizar las diferentes funciones de agregación disponibles.

Sintaxis

La cláusula group by se escribe después del FROM o después del WHERE si tuviese. Debe contener todos los campos que aparezcan en el SELECT que no tienen función de agregación.

La sintaxis básica es:

select campo, sum(cantidad)
from nombreTabla
where condicion
group by campo
order by campo;Lenguaje del código: JavaScript (javascript)

La clausula GROUP BY admite alias del SELECT, FROM o la posición de los campos en el SELECT

Ejemplos

Usaremos la siguiente tabla llamada empleados para realizar los ejemplos (al final de la página está disponible el script para crearla)

Agrupación con funciones de agregación

La forma de agrupar 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:

select puesto,
       avg(sueldo)
from empleados
group by puesto;Lenguaje del código: JavaScript (javascript)
Agrupar registros usando GROUP BY en PostgreSQL

Agrupación sin funciones de agregación

En este caso, poco habitual, la cláusula GROUP BY actúa como si fuese un DISTINCT

select puesto
from empleados
group by puesto;Lenguaje del código: JavaScript (javascript)

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 media del sueldo de la tabla empleados
-- agrupado por puesto
select puesto,
       avg(sueldo)
from empleados
group by puesto;

-- Mostramos los diferentes puestos
select puesto
from empleados
group by puesto;Lenguaje del código: JavaScript (javascript)

Escribir un comentario