Wieviele Werte einer Zeile sind nicht NULL
-
Hi zusammen,
ich brauche eure Hilfe, ich hab eine Tabelle die mehrere Messwerte enthält, nun will ich den Mittelwert aus Messwert 1,2 und 3 also im Prinzip
Select (c1 + c2 + c3)/3 as average from T1
jetzt kann es aber sein, dass einer (oder mehrere) der Messwerte NULL ist, dann wird das Ergebnis NULL, verwende ich
Select (isnull(c1,0) + isnull(c2,0) + isnull(c3,0))/3 as average from T1 erhalte ich nicht das erwünschte Ergebnis. Ergebnisse sollten so aussehen:
c1 c2 c3 avg
1 2 NULL 1.5
1 2 0 1im obeigen Beispiel käme ja aber für beides 1 raus.
Wie löse ich das? Hat einer ne Idee?
Ich darf nicht durch 3 Teilen sondern durch die anzahl von nicht NULL Felder in dieser Zeil, aber wie?vielen Dank schon im Voraus
-
Und wenn Du es anders'rum machst, erst AVG(spalte) und dann die Teilergebnisse addierst? Gibt es sowas wie SELECT isnull(AVG(c1),0) + isnull(AVG(c2),0) + isnull(AVG(c3),0) in Deinem RDBMS?
-
Select (isnull(c1,0) + isnull(c2,0) + isnull(c3,0))/((c1 IS NOT NULL)+(c2 IS NOT NULL)+(c3 IS NOT NULL)) as average from T1
Booleans als int interpretieren und dann addieren..
mfg
xXxPS: Plöd wirds nur, wenn alle 3 NULL sind
Mysql liefert zumindest keinen Error sondern NULL als Ergebnis...
-
Hi Witte ich will ja nicht den Avg von der Splate
@-=]xXx[=- : Ja ich glaub genau das such ich, nur bekomm ich so immer incorect syntax near is ??
Hast du ne Idee? (weil is not null geht nur in der wher bedingung oder?)
-
Select (isnull(c1,0) + isnull(c2,0) + isnull(c3,0))/((ISNULL(c1)=0)+(ISNULL(c2)=0)+(ISNULL(c3)=0))
ebenfalls nicht getestet
mfg
xXxPS: Welche DB in welcher version denn überhaupt? Weil MySQL 5.1 versteht das:
SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1, 1, 0
-
sorry es geht hier um MS SQL 2005
dein letztes Statemaent geht nicht weil wenn nicht null nimmt er nicht 1 sondern c1
bei deiner letzten query kommt vermutlich immer 1 raus oder?
SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL
gibt:
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'IS'.
-
Mmmhhh joa... mit MS SQL kenn ich mich nicht aus. Aber prinzipiell sollte es dort auch irgendwas geben... mindestens nen (IF c1 IS NULL THEN 0 ELSE 1)+(IF c2 IS NULL THEN 0 ELSE 1) [pseudocode]
Vom Prinzip geht es halt darum einen boolean als integer zu benutzen...
mfg
xXx
-
hey vielen dank, so ist es zwar nicht sonderlich schön dafür funktionierts
select (c1+c2+c3)/((Case when c1 is null then 0 else 1 end) + (Case when c2 is null then 0 else 1 end)+ (Case when c2 is null then 0 else 1 end)) from T1
-
zeitgleich bin ich noch auf eine andere Lösung gestossen, fragt sich was schöner ist
(isnull (c1 ,0) + isnull(c2,0) + isnull(c3,0)) /(CASE WHEN isnull(c1,0) <> 0 and isnull(c2,0) <> 0 and isnull(c3,0) <> 0 THEN 3 WHEN ((c1,0) <> 0 or isnull(c2,0) <> 0) or isnull(c3,0) <> 0 THEN 2 WHEN isnull(c1,0) <> 0 or isnull(c2,0) <> 0 or isnull(c3,0) <> 0 THEN 1 WHEN isnull(c1,0) = 0 and isnull(c2,0) = 0 and isnull(c3,0) = 0 THEN 0 Else -1 End as 'Average'