MYSQL: mit Spalten rechnen auch bei NULL Wert

Astarothis79

Grünschnabel
Hallo

Ich komme nicht mehr weiter.

Ich habe 3 Spalten A,B,C .
Diese haben Zahlenwerte zwischen 0 und 10 und auch NULL Wert.
Ich möchte gerne den Durchschnitt der Spalten ermitteln.
0 und NULL Werte sollen dabei nicht berechnet werden.

SQL:
SELECT AVG(`A`) ,AVG(`B`) ,AVG(`C`) ,(AVG(`A`) + AVG(`B`)+ AVG(`C`)) / 3 AS Gesamtdurchschnitt FROM `Tabelle` WHERE `A` <> 0 or `B` <> 0 or `C` <> 0

Soweit funktioniert es. Aber wenn eine Spalte komplett nur NULL Werte hat dann klappt das nicht mehr.

Ich müsste quasi die Spalte vorher prüfen ob komplett NULL und dann dementsprechend ja auch den Gesamtdurchschnitt nicht durch 3 Spalten sondern nur durch 2.

Bin Anfänger und das macht mich irre ;)
Wer kann mir behilflich sein ?
 
Meinst du 0 oder NULL?
Bei 0 soll die Spalte mit eingezogen werden, bei NULL nicht?
 
@vfl_freak Na ob das weiter hilft...? :rolleyes:

Astarothis79, "if" mit einer Subabfrage kann weiterhelfen.
Am Beispiel avg(A), bei dem ich zB. "no" ausgebe wenn alle Einträge der Spalte NULL sind:

Normal eben
SQL:
SELECT avg(a) FROM tabelle WHERE a!=0
mit If-Abfrage:
SQL:
SELECT if((SELECT count(*) FROM tabelle WHERE  IS NOT NULL)>0, avg(a), "no") FROM tabelle WHERE a!=0
Also wenn das count-Select >0 ist dann avg(a) ausgeben, sonst "no".
So ein if-Tupel dann entsprechend für B und C auch.

Und beim Avg von allen muss man es noch etwas weiter verschachteln, also statt avg(a) und "no" weitere if's haben...
 
SQL:
SELECT  IF((SELECT COUNT(*)
FROM Tabelle
WHERE `A` IS not null)>0, avg(`A`), "no")
FROM Tabelle
WHERE `A` !=0


Hab das jetzt so, die Spalte hat alles NULL Einträge. SQL Ausgabe zeigt mir dann NULL an.
Das mit den verschachteln bekomme ich nicht hin. Alleine das diese Syntax stimmt kostete mich eine Stunde :)

Ich bin auch nicht sicher ob das richtig ist. Naja ich probiere mal weiter ...
 
So, ich denke ich habe es. Mit der IF Anweisung bekomme ich es nicht hin.
Jedoch mit Case:

SQL:
SELECT
(case when avg(A) is not null then AVG(A) else 0 end
+
case when avg(B) is not null then AVG(B) else 0 end
+
case when avg(C) is not null then AVG(C) else 0 end)
/
(case when avg(A) is not null then 1 else 0 end
+
case when avg(B) is not null then 1 else 0 end
+
case when avg(C) is not null then 1 else 0 end)
AS Gesamtdurchschnitt
FROM `tabelle`
WHERE `A` <> 0.00 or `B` <> 0.00 or `C` <> 0.00


Kann da einer mal drüber gucken und es absegnen ? Dann könnte man das Thema hier als gelöst schliessen.
Auch wäre ich dankbar wenn jemand die IF Variante hier nochmal komplett darstellen könnte.

MfG Matze
 
Zur Sytnax: Sorry, hatte ein a vergessen... deine Variante ist genau richtig (nur dass ich keine `` um die A hatte, aber sonst kein Unterschied...)

Dass beim If null angezeigt werden soll ist aber sehr seltsam, hatte das sogar getestet...
 

Neue Beiträge

Zurück