Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sum, Avg, Max, Min, Anzahl der NULL-Werte

Das ist eine gute Frage, auf die es keine gute Antwort gibt. Die Behandlung von NULL in Ihren beiden Beispielen ist anders.

Das grundlegende Problem ist, was NULL ist meint. Üblicherweise wird es verwendet, um fehlend zu bezeichnen Werte. Im ANSI-Standard steht es jedoch für ein unbekanntes Wert. Ich bin sicher, Philosophen könnten Bücher über den Unterschied zwischen „fehlend“ und „unbekannt“ schreiben.

In einem einfachen Ausdruck (Boolean oder Arithmetik oder Skalar anderer Art) definiert ANSI das Ergebnis "unbekannt" in fast allen Fällen, in denen einer der Operanden "unbekannt" ist. Es gibt einige Ausnahmen:NULL AND FALSE ist falsch und NULL IS NULL stimmt, aber diese sind selten.

Denken Sie für die Aggregationsoperationen an SUM() als „alle bekannten Werte summieren“ und so weiter. SUM() behandelt NULL Werte anders als + . Aber dieses Verhalten ist auch Standard, so funktionieren alle Datenbanken.

Wenn Sie einen NULL wollen Wert für eine Aggregation, wenn beliebig seiner Operanden ist NULL , dann müssen Sie CASE verwenden . Ich denke, der einfachste Weg für eine einzelne Spalte ist:

(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)