Función AVG en Oracle

La función AVG en Oracle devuelve el promedio de un conjunto de valores (media aritmética). La función AVG está englobada en las denominadas funciones de agregación.

Sintaxis

La sintaxis de la función AVG es la siguiente:

select AVG(expresión)
from tabla;

La función AVG 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 crear la tabla)

Función AVG en Oracle

Ejemplo básico

En el siguiente ejemplo obtenemos el sueldo medio de todos los empleados de la tabla empleados:

select AVG(sueldo)
from empleados;

Ejemplo agrupando

En este otro ejemplo obtenemos la media por cada puesto. Observa cómo necesitamos establecer una agrupación usando GROUP BY:

select puesto, AVG(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.

Recuerda que en un consulta siempre se evalúa primero la cláusula FROM seguido del WHERE y por último la cláusula SELECT. Más información aquí.

Ejemplo con HAVING

En este otro ejemplo mostramos la media del sueldo agrupado por nombre, pero utilizamos la cláusula HAVING para indicar que la media del sueldo debe ser mayor de 60000:

select nombre, AVG(sueldo)
from empleados
group by nombre
having AVG(sueldo) > 60000;

La cláusula HAVING actúa como un WHERE, con la diferencia que debe utilizar funciones de agregación.

Ejemplo con distinct

Se puede utilizar la opción distinct para hacer la media de los valores distintos:

select AVG(sueldo),
       AVG(distinct sueldo)
from empleados;

Ejemplo completo

Copia y pega el siguiente código en tu consola de Oracle y realiza paso a paso leyendo los comentarios:

-- 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 media del sueldo de la tabla empleados
select AVG(sueldo)
from empleados;

-- Mostramos la media del sueldo de la tabla empleados
-- por puesto
select puesto, AVG(sueldo)
from empleados
group by puesto;

-- Mostramos el nombre y la media del sueldo
-- de la tabla empleados cuando la media del sueldo
-- sea mayor de 60000
select nombre, AVG(sueldo)
from empleados
group by nombre
having AVG(sueldo) > 60000;

-- Mostramos la media del sueldo 
-- comparado con la media de los
-- sueldos distintos
select AVG(sueldo),
       AVG(distinct sueldo)
from empleados;

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.