Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:media con valori nulli

Le funzioni aggregate (SUM, AVG, COUNT, ecc.) in SQL escludono sempre automaticamente NULL.

Quindi SUM(col) / COUNT(col) =AVG(col) - questo è fantastico e coerente.

Il caso speciale di COUNT(*) conta ogni riga.

Se crei un'espressione con NULL:A + B dove A o B è NULL, allora A + B sarà NULL indipendentemente dal fatto che l'altra colonna sia NULL.

Quando ci sono NULL, in generale, AVG(A + B) <> AVG(A) + AVG(B), e probabilmente avranno anche denominatori diversi. Dovresti avvolgere le colonne:AVG(COALESCE(A, 0) + COALESCE(B, 0)) per risolverlo, ma forse escludere anche il caso in cui COALESCE(A, 0) + COALESCE(B, 0).

In base al tuo codice, suggerirei:

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;