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)