Mysql
 sql >> Database >  >> RDS >> Mysql

Somma, Media, Max, Min, Conteggio di valori NULL

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)