Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Soma, Média, Máx, Mín., Contagem de valores NULL


Esta é uma boa pergunta, e que não tem uma boa resposta. O tratamento de NULL em seus dois exemplos é diferente.

O problema fundamental é o que NULL significa. Comumente, é usado para denotar ausente valores. No entanto, no padrão ANSI, significa um desconhecido valor. Tenho certeza de que os filósofos poderiam dedicar tomos à diferença entre "desaparecido" e "desconhecido".

Em uma expressão simples (booleana ou aritmética ou escalar de outro tipo), o ANSI define o resultado como "desconhecido" em quase todos os casos em que qualquer um dos operandos é "desconhecido". Existem algumas exceções:NULL AND FALSE é falso e NULL IS NULL é verdade, mas estes são raros.

Para as operações de agregação, pense em SUM() como "soma todos os valores conhecidos", e assim por diante. SUM() trata NULL valores diferentes de + . Mas, esse comportamento também é padrão, então é assim que todos os bancos de dados funcionam.

Se você quer um NULL valor para uma agregação quando qualquer de seus operandos é NULL , então você precisa usar CASE . Acho que a maneira mais fácil para uma única coluna é:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)