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: contar filas o valores

COUNT(*)
COUNT(Columna)

SUM: sumar valores numéricos

SUM(ColumnaNumerica)

AVG: calcular el promedio

AVG(ColumnaNumerica)

MIN: obtener el valor menor

MIN(Columna)

MAX: obtener el valor mayor

MAX(Columna)

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

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. NULL representa un valor ausente o desconocido; no equivale a cero ni a una cadena vacía.

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. En DECIMAL, la precisión es la cantidad total de dígitos y la escala indica cuántos quedan después del separador decimal.

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

Relacionado con