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 1

    im 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
    xXx

    PS: 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
    xXx

    PS: 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'
    

Anmelden zum Antworten