NULL en count, sum y avg
Básicocount(*) cuenta filas; count(columna) cuenta solo las filas donde esa columna no es NULL. sum, avg, min y max ignoran los NULL: el promedio se calcula solo sobre los valores presentes. Si no queda ningún valor, sum devuelve NULL, no 0.
Sintaxis
SELECT
count(*) AS filas,
count(columna) AS filas_con_valor,
avg(columna) AS promedio_de_los_presentes
FROM tabla;Ejemplo
SELECT
count(*) AS calificaciones,
count(r.courier_rating) AS con_nota_al_repartidor,
round(avg(r.courier_rating), 2) AS promedio_ignorando_null,
round(avg(COALESCE(r.courier_rating, 0)), 2) AS promedio_null_como_cero
FROM ratings AS r
INNER JOIN orders AS o ON o.id = r.order_id
INNER JOIN restaurants AS re ON re.id = o.restaurant_id
INNER JOIN cities AS c ON c.id = re.city_id
WHERE c.name = 'Lima';Resultado
| calificaciones | con_nota_al_repartidor | promedio_ignorando_null | promedio_null_como_cero |
|---|---|---|---|
| 588 | 454 | 4.18 | 3.23 |
Cómo leerlo
En Lima hay 588 calificaciones, pero solo 454 incluyen nota para el repartidor. avg divide la suma de esas notas entre 454 y da 4.18. Si conviertes los NULL en 0, divides entre 588 y el promedio baja a 3.23: estarías tratando «no calificó» como «le puso cero». La columna correcta depende de la pregunta, pero casi nunca es la segunda.
Error común
Así no
SELECT sum(o.total) AS ventas
FROM orders AS o
WHERE o.restaurant_id = 12
AND o.placed_at >= '2030-01-01';Esperar 0 cuando no hay valores. Si ninguna fila pasa el filtro, o todas tienen NULL en la columna, sum devuelve NULL, y un tablero puede mostrarlo como vacío o romper un cálculo posterior. Si el negocio necesita un 0, escríbelo explícitamente: COALESCE(sum(o.total), 0). count es la excepción: sin filas devuelve 0.