La función AVG en PostgreSQL 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 crearla)
Ejemplo básico
En el siguiente ejemplo obtenemos la media de sueldos 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 ultimo 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 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
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;