COUNT, SUM, AVG, MIN y MAX: resumir un conjunto

A veces no necesitamos observar cada producto por separado. Queremos saber cuántos están activos, cuánto suman sus precios o cuáles son los valores mínimo y máximo del catálogo.

Las funciones de agregación toman varias filas y producen un valor resumido.

La idea

Cada función responde una pregunta distinta:

  • COUNT cuenta filas o valores.
  • SUM suma valores numéricos.
  • AVG calcula el promedio.
  • MIN obtiene el valor menor.
  • MAX obtiene el valor mayor.

Sin GROUP BY, la consulta produce una sola fila para todo el conjunto filtrado.

Sintaxis

SELECT
    COUNT(*) AS Cantidad,
    SUM(ColumnaNumerica) AS Total,
    AVG(ColumnaNumerica) AS Promedio,
    MIN(ColumnaNumerica) AS Minimo,
    MAX(ColumnaNumerica) AS Maximo
FROM dbo.Tabla
WHERE Condicion;

Ejemplo

Para resumir los precios de los productos activos:

SELECT
    COUNT(*) AS CantidadProductos,
    SUM(p.Precio) AS SumaPrecios,
    AVG(p.Precio) AS PrecioPromedio,
    MIN(p.Precio) AS PrecioMinimo,
    MAX(p.Precio) AS PrecioMaximo
FROM dbo.Producto AS p
WHERE p.Activo = 1;
CantidadProductos SumaPrecios PrecioPromedio PrecioMinimo PrecioMaximo
5 2186.40 437.28 189.50 799.00

El filtro se aplica antes del resumen. El disco externo inactivo no participa en ninguno de los cinco cálculos.

COUNT(*) y COUNT(Columna)

Estas formas no siempre devuelven lo mismo:

SELECT
    COUNT(*) AS TotalClientes,
    COUNT(c.Correo) AS ClientesConCorreo
FROM dbo.Cliente AS c;

COUNT(*) cuenta las filas. COUNT(c.Correo) cuenta únicamente aquellas donde Correo no es NULL.

Si la tabla contiene cinco clientes y uno no tiene correo, el resultado es:

TotalClientes ClientesConCorreo
5 4

Expresiones dentro de una agregación

Las funciones también pueden resumir una expresión. Para calcular el importe antes de descuento de todas las partidas:

SELECT
    SUM(d.Cantidad * d.PrecioUnitario) AS ImporteBruto
FROM dbo.PedidoDetalle AS d;

La multiplicación se realiza por cada fila y SUM agrega después los resultados.

Qué conviene comprobar

Excepto COUNT(*), las funciones de agregación ignoran valores NULL. Eso puede ser correcto o puede ocultar datos faltantes; depende de la pregunta.

El tipo de dato también influye. AVG conserva reglas asociadas al tipo de entrada y una división o multiplicación puede perder precisión si utilizamos enteros o tipos inadecuados. Para importes conviene revisar la precisión y escala de DECIMAL.

Un JOIN puede multiplicar filas antes de la agregación. Si el total parece demasiado alto, debemos comprobar primero la cardinalidad del conjunto que está llegando a SUM o COUNT.

Relacionado con

  • GROUP BY: produce un resumen por cada grupo.
  • HAVING: filtra los grupos calculados.
  • OVER: calcula agregados sin reducir las filas del resultado.
  • COALESCE: permite decidir cómo presentar un agregado nulo.