2014-03-14 11 views
9

Lassen Sie sich die folgende Tabelle annehmen:MySQL - Summe nur dann, wenn alle Zeilen sind nicht null, sonst return null

X VALUE 
1 2 
1 3 
2 NULL 
2 4 

ich eine Ergebnismenge von X mit der Summe von VALUE gruppiert werden soll, aber nur, wenn alle Zeilen bezogen auf jeden X-Wert sind nicht null.

das gleiche Beispiel verwenden, muss das Ergebnis sein:

X SUM(VALUE) 
1 5 

Wie Sie sehen können, ist X=2 nicht aufgrund der Tupel (2, NULL) ausgewählt.

Ich möchte, wann immer dies möglich ist, ohne Unterabfragen zu verwenden.

Vielen Dank!

Antwort

12

können Sie erreichen, dass mit:

SELECT 
    x, 
    SUM(value) 
FROM 
    t 
GROUP BY 
    x 
HAVING 
    COUNT(value)=COUNT(*) 

Dies folgt funktioniert: Gruppenwerte in normaler Art und Weise, aber dann ganze Zählung vergleichen (so * zeigt auf, dass) mit Spaltenanzahl (welche nicht enthalten NULL -s). Wenn sie nicht gleich sind, dann gibt es NULL und Wert sollte nicht enthalten sein.

+2

+1 Nifty, wie in warum ich glaube nicht, dass? :) –

+0

Arbeitete perfekt, danke – user3418803

+0

Ich wünschte, ich könnte dies zweimal upvote. Danke, tolle Antwort - einfach aber nicht offensichtlich – billynoah

-1

Diese whould arbeiten:

SELECT SUM(value) FROM test WHERE value IS NOT NULL GROUP BY X 
+1

hast du deine Antwort überprüft? – Sathish

+1

Dies schließt nur "NULL" aus der gesamten Gruppe aus, wirkt sich jedoch nicht auf Nicht-Null-Werte bei der Berechnung der Aggregatergebnisse aus –

2

Ein anderer Weg, dies ist. Es kann oder auch nicht schneller sein:

SELECT X, IF(SUM(VALUE is NULL), NULL, SUM(VALUE)) as value 
FROM table_name 
group by X 
having not(null <=> value); 

Auch mit dieser Methode, wenn Sie die Klausel having Sie alle Zeilen bekommen entfernen, aber mit Null-Werten für die summierten Spalten mit NULL-Werten, die Sie dann bedingt etwas anderes tun könnten mit in deinem Skript.

http://sqlfiddle.com/#!2/f769cc/18