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:
COUNTcuenta filas o valores.SUMsuma valores numéricos.AVGcalcula el promedio.MINobtiene el valor menor.MAXobtiene 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.