2010-03-19 7 views
7

Gibt es eine einfache Möglichkeit, Nullen von der Beeinflussung des avg auszuschließen? Sie scheinen mit 0 zu zählen, was ich nicht will. Ich möchte einfach nicht ihren Durchschnitt berücksichtigen, aber hier ist der Haken, ich kann sie nicht aus dem Ergebnissatz löschen, da dieser Datensatz Daten darüber enthält, die ich brauche.MySQL: Mittelung mit Nullen

Update:

Beispiel:

select avg(col1+col2), count(col3) from table1 
where 
group by SomeArbitraryCol 
having avg(col1+col2) < 500 and count(col3) > 3 
order by avgcol1+col2) asc; 

Das ist für mich arbeiten würde, aber die Mittelwerte sind nicht genau, wie sie Nullwerte als 0 zählen, die wirklich weg wirft die ganzer Durchschnitt.

+0

Welche Sprache? Oder machst du das alles in SQL? –

+0

einfache SQL unter MySQL – Zombies

+1

Ich habe es nicht verstanden, warum nicht nur Datensätze mit nicht Null-Werte und avg sie auswählen? – questzen

Antwort

13

Aggregatfunktionen (SUM, AVG, COUNT usw.) in SQL schließen NULL immer automatisch aus.

Also SUM (col)/COUNT (col) = AVG (col) - das ist großartig und konsistent.

Der Sonderfall COUNT (*) zählt jede Zeile.

Wenn Sie einen Ausdruck mit NULLs erstellen: A + B, wobei entweder A oder B NULL ist, dann ist A + B NULL, unabhängig davon, ob die andere Spalte NULL ist.

Wenn es NULL gibt, im Allgemeinen AVG (A + B) <> AVG (A) + AVG (B), und sie werden wahrscheinlich auch unterschiedliche Nenner haben. Sie müssten die Spalten umbrechen: AVG (COALESCE (A, 0) + COALESCE (B, 0)), um dies zu lösen, aber vielleicht auch den Fall, wo COALESCE (A, 0) + COALESCE (B, 0).

Basierend auf Ihren Code, würde ich vorschlagen:

select avg(coalesce(col1, 0) + coalesce(col2, 0)), count(col3) from table1 
where coalesce(col1, col2) is not null -- double nulls are eliminated 
group by SomeArbitraryCol 
having avg(coalesce(col1, 0) + coalesce(col2, 0)) < 500 and count(col3) > 3 
order by avg(coalesce(col1, 0) + coalesce(col2, 0)) asc; 
5
AVG(number) 

Ist der beste Weg, den ich mir vorstellen kann. Dies sollte automatisch die Nullen nicht enthalten. Here ist ein wenig zu lesen.

+0

Ist das für Nummer1 + Nummer2 gleich? Weil ich das nicht verstehe, scheinen für mich die Nullen als 0 zu zählen, was den Mittelwert zu sehr belastet. – Zombies

+0

@Zombies Nein, es ist nicht dasselbe für einen manuellen Additionsausdruck, der den normalen NULL-Regeln folgt. –

3
SELECT SUM(field)/COUNT(field) 
FROM table 
WHERE othercondition AND (field IS NOT NULL) 

Link

+0

Werden die Spalten nicht gelöscht, wenn das Feld null ist? Ich brauche diese Spalte aber, was das schwierig macht. – Zombies

+1

AVG (col) ist immer äquivalent zu SUM (col)/COUNT (col) und NULLs werden automatisch ausgeschlossen, daher liefert diese Abfrage immer die gleichen Ergebnisse wie SELECT AVG (Feld) FROM Tabelle WHERE andere Bedingung. –

1

Antwort basierend auf ursprüngliche Frage:

SELECT AVG(t1.NumCol + t1.NumCol2), COUNT(table.NumCol) 
FROM 
(
SELECT NumCol, NumCol2 
FROM table 
WHERE (cond) AND (NumCol IS NOT NULL) AND (NumCol2 IS NOT NULL) 
) t1, 
table 
WHERE (cond) 

ich mit den neuen Beschränkungen denke, das funktioniert immer noch in der Theorie, aber es ist nicht die effizienteste Art und Weise

1

Es gibt eine gute Chance, dass Sie in der Lage sein werden aus auf die richtige Antwort zu bekommen, was andere hier gesagt haben, aber falls Sie nicht:

Welche Werte in Ihrer Tabelle könnten NULL sein? Und was willst du tun, wenn einer von ihnen ist?

Sie nie angeben, welche Ergebnisse Sie sehen wollen, wenn col1 NULL ist, oder col2 NULL ist, oder wenn sie beide NULL sein passieren, usw.

0

Früher habe ich vor kurzem diesen Trick:

AVG(
    CASE 
     WHEN 
      valToBeAveraged IS NULL 
     THEN 
      0 
     ELSE 
      valToBeAveraged 
    END 
) 

Ich glaube, die Warnung ist genau das. Aber das gibt mir Seelenfrieden, weil ich genau weiß, wie es funktioniert.

Happy Codierung