Función AVG en SQL

Por el equipo de promedio.net · Actualizado el

AVG(columna) devuelve el promedio de los valores no nulos de una columna: suma esos valores y divide entre cuántos son. Se usa en el SELECT, se combina con WHERE para promediar solo algunas filas y con GROUP BY para promediar por categoría. Si ninguna fila cumple la condición, el resultado es NULL, no cero.

Sintaxis

SELECT AVG(columna) FROM tabla;
SELECT AVG(columna) FROM tabla WHERE condicion;
SELECT AVG(DISTINCT columna) FROM tabla;          -- solo valores distintos
SELECT ROUND(AVG(columna), 2) AS promedio FROM tabla;

AVG es estándar: la misma consulta funciona en MySQL, PostgreSQL, SQL Server, Oracle y SQLite. La columna debe ser numérica; en algunos motores, una columna de texto con números se convierte sola y en otros da error.

Paso a paso

  1. Identifica la tabla y la columna numérica que quieres promediar.
  2. Escribe SELECT AVG(columna) AS promedio FROM tabla. El alias AS le da un nombre legible a la columna del resultado.
  3. Si solo te interesan algunas filas, agrega WHERE antes de agrupar o promediar.
  4. Redondea con ROUND(AVG(columna), 2) si vas a mostrar el resultado.
  5. Si quieres un promedio por categoría, agrega GROUP BY; está en AVG con GROUP BY.

Tabla de ejemplo:

CREATE TABLE ventas (
  id       INTEGER PRIMARY KEY,
  sucursal VARCHAR(20),
  vendedor VARCHAR(20),
  fecha    DATE,
  importe  DECIMAL(10, 2)
);
INSERT INTO ventas (sucursal, vendedor, fecha, importe) VALUES
  ('Centro', 'Ana',   '2026-10-01', 1250.00),
  ('Centro', 'Ana',   '2026-10-02',  980.50),
  ('Centro', 'Beto',  '2026-10-02', 1430.00),
  ('Norte',  'Carla', '2026-10-01', 2100.00),
  ('Norte',  'Carla', '2026-10-03', 1875.25),
  ('Norte',  'Dani',  '2026-10-03',  640.00),
  ('Sur',    'Eli',   '2026-10-02', 1500.00),
  ('Sur',    'Eli',   '2026-10-04', 1500.00);

Ejemplos resueltos

Ejemplo 1: promedio de toda la tabla y de una sucursal

SELECT AVG(importe) AS promedio FROM ventas;

SELECT ROUND(AVG(importe), 2) AS promedio_norte
FROM ventas
WHERE sucursal = 'Norte';
promediopromedio_norte
1409.468751538.42

Las 8 ventas suman 11,275.75; entre 8 da 1,409.46875. Las tres del Norte suman 4,615.25 y su promedio, 1,538.4166…, se redondea a 1,538.42. SQL Server mostraría el primer resultado como 1409.468750, porque el promedio de un DECIMAL(10,2) es un DECIMAL(38,6).

Ejemplo 2: resumen de un periodo con varias funciones

SELECT COUNT(*)               AS n,
       ROUND(AVG(importe), 2) AS promedio,
       MIN(importe)           AS minimo,
       MAX(importe)           AS maximo
FROM ventas
WHERE fecha BETWEEN '2026-10-02' AND '2026-10-03';
npromediominimomaximo
51285.156401875.25

Mostrar n, mínimo y máximo junto al promedio da contexto: con solo 5 ventas y un rango de 640 a 1,875.25, el promedio de 1,285.15 esconde mucha variación. BETWEEN incluye ambos extremos.

Ejemplo 3: AVG con DISTINCT

SELECT AVG(importe)          AS promedio,
       AVG(DISTINCT importe) AS promedio_distintos
FROM ventas;
promediopromedio_distintos
1409.468751396.5357142857142

Eli tiene dos ventas de 1,500.00. DISTINCT cuenta ese importe una sola vez y divide entre 7 valores distintos. Casi nunca es lo que quieres para importes; sirve, por ejemplo, para promediar los precios distintos de un catálogo con filas repetidas.

Qué devuelve AVG en cada motor

MotorColumna enteraColumna decimalSin filas
PostgreSQLnumeric (con decimales)numericNULL
MySQLDECIMAL (con decimales)DECIMALNULL
SQL Serverint: trunca los decimalesdecimal(38, s) con s de al menos 6NULL
SQLitePunto flotantePunto flotanteNULL

El caso de SQL Server con enteros es la trampa más común; lo explicamos en AVG con enteros.

Errores comunes

Fuentes

  1. PostgreSQL, funciones de agregado. avg y tipos de resultado. Consultado el 11 de noviembre de 2026.
  2. Microsoft Learn, AVG (Transact-SQL). Tipos de retorno por tipo de columna. Consultado el 11 de noviembre de 2026.
  3. SQLite, funciones de agregado. avg siempre devuelve un valor de punto flotante. Consultado el 11 de noviembre de 2026.