La función SUM en PostgreSQL es una de las funciones de agregación más utilizadas, diseñada para calcular la suma de un conjunto de valores numéricos no nulos. Esta función resulta esencial cuando se necesita obtener el total de una columna en una tabla, como en el caso de sumas de ventas, totales de ingresos o cualquier otra operación que implique valores numéricos.
Al utilizar SUM que está englobada en las denominadas funciones de agregación, es importante recordar que la función solo considera los valores no nulos, lo que puede ser útil para evitar sumas erróneas o incompletas. Además, SUM puede emplearse junto con la cláusula GROUP BY para obtener totales por categorías específicas, como por ejemplo, la suma de ventas por región o producto.
En este artículo, te mostraré cómo usar la función SUM en tus consultas de PostgreSQL y cómo optimizar su implementación en distintos escenarios. Para más información, puedes consultar la documentación oficial de PostgreSQL.
Sintaxis
La sintaxis para utilizar la función SUM en PostgreSQL es la siguiente:
select SUM(expresión) from tabla
La función SUM en PostgreSQL no es exclusiva de la cláusula SELECT. También es posible utilizarla en las cláusula HAVING.
Ejemplos
Usaremos la siguiente tabla llamada empleados para realizar los ejemplos (al final de la página esta disponible el script para crearla)
Ejemplo básico
En el siguiente ejemplo obtenemos la suma de todos los sueldos de la tabla empleados:
select SUM(sueldo) as SUMA from empleados;
Ejemplo agrupando
En este otro ejemplo obtenemos la suma del sueldo por cada puesto. Observa cómo necesitamos establecer una agrupación usando GROUP BY:
select puesto, SUM(sueldo) from empleados group by puesto;
Recuerda que si en la cláusula SELECT escribes mas campos que no usen la función de agregación, debes incluirlos en el GROUP BY.
Ejemplo con distinct
Puedes usar la cláusula distinct para sumar los valores distintos y evitar así duplicados:
select SUM(sueldo), SUM(distinct sueldo) from empleados;
Recuerda que en un consulta siempre se evalúa primero la cláusula FROM seguido del WHERE y por ultimo la cláusula SELECT. Más información aquí.
Ejemplo con HAVING
En este otro ejemplo sumamos el sueldo agrupado por nombre, pero utilizamos la cláusula HAVING para indicar que la suma del sueldo debe ser mayor de 60000:
select nombre, SUM(sueldo) from empleados group by nombre having SUM(sueldo) > 60000;
La cláusula HAVING actúa como un WHERE, con la diferencia que debe utilizar funciones de agregación.
Ejemplo completo
Copia y pega el siguiente código en tu consola de PostgreSQL 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 select SUM(sueldo) from empleados; -- Mostramos la suma del sueldo de la tabla empleados -- por puesto select puesto, SUM(sueldo) from empleados group by puesto; -- Sumamos los sueldos y los sueldos distintos -- de la tabla empleados select SUM(sueldo), SUM(distinct sueldo) from empleados; -- Mostramos el nombre y la suma del sueldo -- de la tabla empleados cuando la suma del --sueldo sea mayor de 60000 select nombre, SUM(sueldo) from empleados group by nombre having SUM(sueldo) > 60000;