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.