En este articulo 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;
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 esta 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;

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;

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;