Questa è una buona domanda e non ha una buona risposta. Il trattamento di NULL nei tuoi due esempi è diverso.
Il problema fondamentale è cosa NULL significa. Comunemente, è usato per denotare mancante i valori. Tuttavia, nello standard ANSI, sta per sconosciuto valore. Sono sicuro che i filosofi potrebbero dedicare dei tomi alla differenza tra "scomparso" e "sconosciuto".
In un'espressione semplice (booleana o aritmetica o scalare di altro tipo), ANSI definisce il risultato di "sconosciuto" in quasi tutti i casi in cui uno qualsiasi degli operandi è "sconosciuto". Ci sono alcune eccezioni:NULL AND FALSE è falso e NULL IS NULL è vero, ma sono rari.
Per le operazioni di aggregazione, pensa a SUM() come "somma di tutti i valori noti" e così via. SUM() considera NULL valori diversi da + . Ma anche questo comportamento è standard, quindi è così che funzionano tutti i database.
Se vuoi un NULL valore per un'aggregazione quando qualsiasi dei suoi operandi è NULL , quindi devi utilizzare CASE . Penso che il modo più semplice per una singola colonna sia:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)