O padrão ANSI SQL define (capítulo 6.5, definir especificação de função) o seguinte comportamento para funções agregadas em conjuntos de resultados vazios:
COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL
Retornar NULL para AVG, MIN e MAX faz todo o sentido, pois a média, o mínimo e o máximo de um conjunto vazio são indefinidos.
O último, no entanto, me incomoda: Matematicamente, a soma de um conjunto vazio é bem definida: 0
. Usando 0, o elemento neutro de adição, como o caso base, torna tudo consistente:
SUM({}) = 0 = 0
SUM({5}) = 5 = 0 + 5
SUM({5, 3}) = 8 = 0 + 5 + 3
SUM({5, NULL}) = NULL = 0 + 5 + NULL
Definir SUM({})
como null
basicamente torna "sem linhas" um caso especial que não se encaixa nos outros:
SUM({}) = NULL = NULL
SUM({5}) = 5 != NULL + 5 (= NULL)
SUM({5, 3}) = 8 != NULL + 5 + 3 (= NULL)
Existe alguma vantagem óbvia da escolha que foi feita (SUM sendo NULL) que eu perdi?