Saltar al contenido

Valores extraños de anomalía de MySQL AVG () NULL

Solución:

Este es el comportamiento correcto, porque NULL no es lo mismo que el número 0.
Para algunas personas que no hablan inglés, esto puede resultar sorprendente, porque en muchos idiomas “nulo” es equivalente a “cero”.

Conceptualmente NULL se refiere a un “valor desconocido” y, como tal, se trata de manera diferente a otros valores. Es por eso que funciones agregadas como AVG() ignorar NULLs.

AVG() calcula el promedio de todos los valores “conocidos” únicamente. (= que son no NULO)

De los documentos de MySQL:

A menos que se indique lo contrario, las funciones de grupo ignoran los valores NULL.

Además, lea sobre el concepto de NULLs en la Sección “3.3.4.6 Trabajar con valores NULL” del manual de MySQL.

Para conseguir lo que quieres, puedes hacer

SELECT AVG(IFNULL(marks, 0)) 
FROM sample 
GROUP BY name;

IFNULL() devuelve el segundo argumento para los cálculos si el valor es NULL o pasa por el valor de otra manera.


Hay malentendidos más comunes con respecto al concepto de NULL. También se explican en la sección “5.5.3 Problemas con NULL” del manual:

  • En SQL, el NULL El valor nunca es verdadero en comparación con cualquier otro valor, incluso NULL. Una expresión que contiene NULL siempre produce un NULL valor a menos que se indique lo contrario en la documentación para los operadores y funciones involucradas en la expresión.

    es decir: NULL == 0 da como resultado NULL en lugar de true. También NULL == NULL da como resultado NULL, en lugar de verdadero.

  • Para buscar valores de columna que son NULL, no puedes usar un expr = NULL prueba. Buscar NULL valores, debe utilizar el IS NULL prueba.
  • Cuando usas DISTINCT, GROUP BY, o ORDER BY, todos NULL los valores se consideran iguales.
  • Cuando usas ORDER BY, NULL los valores se presentan primero, o al final si especifica DESC para ordenar en orden descendente.
  • Para algunos tipos de datos, MySQL maneja valores NULL especialmente. Si inserta NULL en un TIMESTAMP columna, se inserta la fecha y hora actuales.
  • Si inserta NULL en una columna entera o de punto flotante que tiene el AUTO_INCREMENT atributo, se inserta el siguiente número de la secuencia.
  • Una columna que tiene un UNIQUE La clave definida todavía puede contener múltiples NULL valores.

Tratar:

select avg(case marks when null then 0 else marks end) from sample group by name;

O intente evitar nulos en la tabla;)

Puedes hacer esto en su lugar:

SELECT SUM(marks) / COUNT(name)
FROM sample 
GROUP BY name;
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *