sql >> Base de Datos >  >> RDS >> Mysql

Suma, Promedio, Máx., Mín., Recuento de valores NULL

Esta es una buena pregunta, y una que no tiene una buena respuesta. El tratamiento de NULL en tus dos ejemplos es diferente.

El problema fundamental es qué NULL medio. Comúnmente, se usa para denotar faltante valores. Sin embargo, en el estándar ANSI, significa un desconocido valor. Estoy seguro de que los filósofos podrían dedicar tomos a la diferencia entre "desaparecido" y "desconocido".

En una expresión simple (booleana, aritmética o escalar de otro tipo), ANSI define el resultado de "desconocido" en casi todos los casos en los que alguno de los operandos es "desconocido". Hay algunas excepciones:NULL AND FALSE es falso y NULL IS NULL es cierto, pero estos son raros.

Para las operaciones de agregación, piense en SUM() como "sumar todos los valores conocidos", y así sucesivamente. SUM() trata NULL valores diferentes de + . Pero este comportamiento también es estándar, así es como funcionan todas las bases de datos.

Si quieres un NULL valor para una agregación cuando cualquiera de sus operandos es NULL , entonces necesitas usar CASE . Creo que la forma más fácil para una sola columna es:

(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)