Funkcje agregujące (SUM, AVG, COUNT itp.) w SQL zawsze automatycznie wykluczają NULL.
Więc SUM(col) / COUNT(col) =AVG(col) — to jest świetne i spójne.
Specjalny przypadek COUNT(*) liczy każdy wiersz.
Jeśli stworzysz wyrażenie z wartościami NULL:A + B, gdzie A lub B to NULL, wtedy A + B będzie NULL, niezależnie od tego, czy inna kolumna będzie NULL.
Ogólnie rzecz biorąc, jeśli istnieją wartości NULL, AVG(A + B) <> AVG(A) + AVG(B) i prawdopodobnie będą miały również różne mianowniki. Aby rozwiązać ten problem, musiałbyś zawinąć 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).
Na podstawie Twojego kodu sugerowałbym:
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;