La función SUM en Oracle 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. Es una herramienta fundamental para obtener totales de columnas en tablas, como sumas de ventas, ingresos totales o cualquier operación que involucre datos numéricos.
Al usar SUM, es importante tener en cuenta que solo considera los valores no nulos, lo cual es útil para evitar cálculos incorrectos o incompletos. Además, SUM se puede combinar con la cláusula GROUP BY para calcular totales por categorías específicas, como la suma de ventas por región o producto.
En este artículo, te enseñaré cómo emplear la función SUM en Oracle para optimizar tus consultas y abordar distintos escenarios de manera eficiente. Para más información, consulta la documentación oficial de la función SUM en Oracle.
Versión
Este artículo ha sido redactado utilizando la versión Oracle Database 23ai para garantizar compatibilidad y precisión en los ejemplos presentados.
Sintaxis
La sintaxis de la función SUM en Oracle es la siguiente:
select SUM(expresión) from tabla
La función SUM no es exclusiva de la cláusula SELECT. También es posible utilizarla en las cláusulas WHERE y HAVING.
Ejemplos
Usaremos la siguiente tabla llamada empleados para realizar los ejemplos (al final de la página está disponible el script para crearla)
Suma de una columna completa
SELECT SUM(SUELDO) AS SUMA FROM EMPLEADOS;
Explicación: Calcula la suma total de todos los valores en la columna sueldo
de la tabla empleados
.
Uso típico: Obtener el total de ingresos, costos o métricas acumulativas.
Suma con condición
SELECT ID_DEPARTAMENTO, SUM(SUELDO) AS TOTAL_POR_DEPARTAMENTO FROM EMPLEADOS WHERE ID_DEPARTAMENTO = 1;
Explicación: Suma únicamente los sueldos de los empleados que pertenecen al departamento con departamento_id = 10
.
Uso típico: Filtrar datos antes de sumar, útil para reportes específicos.
Ejemplo agrupando
SELECT ID_DEPARTAMENTO, SUM(SUELDO) AS TOTAL_POR_DEPARTAMENTO FROM EMPLEADOS GROUP BY ID_DEPARTAMENTO;
Agrupa los registros por departamento_id
y calcula la suma de los sueldos en cada grupo.
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.
Suma de valores distintos
SELECT SUM(SUELDO), SUM(DISTINCT SUELDO) FROM EMPLEADOS;
Explicación: Suma únicamente los valores únicos en la columna sueldo
, ignorando duplicados.
Uso típico: Eliminar duplicados en cálculos acumulativos.
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í.
Filtrar grupos
SELECT NOMBRE, SUM(SUELDO) FROM EMPLEADOS GROUP BY NOMBRE HAVING SUM(SUELDO) > 60000;
Explicación: La consulta agrupa a los empleados por departamento_id
y calcula la suma de los sueldos en cada grupo utilizando SUM(sueldo).
La cláusula HAVING
se utiliza para filtrar únicamente los grupos cuya suma de sueldos sea mayor a 60000. A diferencia de WHERE
, que filtra filas antes de agrupar, HAVING
actúa sobre los datos ya agrupados.
Uso típico: Filtrar resultados agregados, como departamentos, regiones o categorías, que cumplan con ciertas condiciones. Muy útil en reportes financieros o de rendimiento para excluir grupos con totales por debajo de un umbral específico.
La cláusula HAVING actúa como un WHERE, con la diferencia que debe utilizar funciones de agregación.
Suma con subconsulta
SELECT SUM(SUELDO) AS TOTAL_SUELDO FROM ( SELECT SUELDO FROM EMPLEADOS WHERE ID_DEPARTAMENTO = 1 );
Explicación: Utiliza una subconsulta para filtrar los datos antes de realizar la suma. Solo se suman los sueldos de los empleados en el departamento 20.
Uso típico: Realizar cálculos más avanzados basados en subconjuntos de datos.
Ejemplo completo
Copia y pega el siguiente código en tu consola de Oracle y realiza paso a paso leyendo los comentarios:
Para visualizar las instrucciones es necesario iniciar sesión desde desde la barra lateral derecha, desde los comentarios o desde el pie de página. Puedes utilizar tu cuenta de Microsoft o de Google. Gracias.