2010-03-19 13 views
7

Czy istnieje prosty sposób, aby wykluczyć wartości null wpływające na średnią ważoną? Wygląda na to, że liczą się jako 0, co nie jest tym, czego chcę. Po prostu nie chcę brać pod uwagę ich średniej, ale tutaj jest haczyk, nie mogę ich usunąć z zestawu wyników, ponieważ ten rekord zawiera dane, które są mi potrzebne.MySQL: uśrednianie z wartościami zerowymi

Aktualizacja:

przykład:

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; 

To będzie pracować dla mnie, ale średnie nie są dokładne, ponieważ liczą na wartości null jako 0, co jest naprawdę rzuca off cała średnia.

+0

Jaki język? Czy robisz to wszystko w SQL? –

+0

proste SQL w MySQL – Zombies

+1

Nie dostałem, dlaczego nie wybrać tylko rekordy z wartościami null i ich średnia? – questzen

Odpowiedz

13

Funkcje agregujące (SUMA, AVG, COUNT, itp.) W SQL zawsze automatycznie wykluczają NULL.

Tak SUMA (col)/COUNT (col) = AVG (col) - to jest świetne i spójne.

Specjalny przypadek COUNT (*) liczy każdy wiersz.

Jeśli tworzysz wyrażenie z wartościami NULL: A + B, gdzie A lub B ma wartość NULL, wówczas A + B będzie NULL, niezależnie od tego, czy inna kolumna ma wartość NULL.

Gdy występują wartości NULL, na ogół AVG (A + B) <> AVG (A) + AVG (B) i prawdopodobnie będą też mieć różne mianowniki. Aby rozwiązać ten problem, należy zawijać kolumny: AVG (COALESCE (A, 0) + COALESCE (B, 0)), ale być może również wykluczyć przypadek, w którym COALESCE (A, 0) + COALESCE (B, 0).

podstawie kodu, chciałbym zaproponować:

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) 

To najlepszy sposób, jaki mogę wymyślić. To powinno automatycznie nie uwzględniać wartości zerowych. Here to małe czytanie.

+0

Czy to samo dotyczy numer1 + numer2? Ponieważ tego nie rozumiem, dla mnie wydaje się, że wartości zerowe liczą się jako 0, co powoduje zbyt duże obniżenie średniej. – Zombies

+0

@Zombies Nie, to nie jest to samo dla ręcznego wyrażenia dodawania, które wynika z normalnych reguł NULL. –

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

Link

+0

Czy to nie upuszczenie cols gdzie pole jest zerowe? Potrzebuję tego cola, co sprawia, że ​​jest to trudne. – Zombies

+1

AVG (col) jest zawsze równoznaczne z SUM (col)/COUNT (col), a wartości NULL są automatycznie wykluczane, więc to zapytanie zawsze zwróci takie same wyniki jak SELECT AVG (field) FROM table WHERE othercondition. –

1

odpowiedzi na podstawie pierwotnego pytania:

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) 

myślę z nowymi ograniczeniami, to nadal działa w teorii, ale nie jest to najbardziej efektywny sposób

1

Jest duża szansa, że ​​będziesz w stanie uzyskać na prawidłową odpowiedź od tego, co mówili inni tutaj, ale w przypadku, gdy nie posiadają:

Jakie wartości w tabeli MOGĄ mieć wartość NULL? I co chcesz zrobić, jeśli któryś z nich jest?

Nigdy określić, jakie wyniki chcesz zobaczyć, jeśli col1 jest NULL, lub col2 jest NULL, czy też zarówno stało się NULL itp

0

Niedawno używany ten trick:

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

Uważam, że ostrzeżenie jest właśnie takie. Ale to zapewnia mi spokój, ponieważ wiem dokładnie, jak to działa.

Szczęśliwe kodowanie

Powiązane problemy