Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :faire la moyenne avec des valeurs nulles

Les fonctions d'agrégation (SUM, AVG, COUNT, etc.) en SQL excluent toujours automatiquement NULL.

Donc SUM(col) / COUNT(col) =AVG(col) - c'est génial et cohérent.

Le cas particulier de COUNT(*) compte chaque ligne.

Si vous composez une expression avec NULL :A + B où A ou B est NULL, alors A + B sera NULL, que l'autre colonne soit NULL.

Lorsqu'il y a des NULL, en général, AVG(A + B) <> AVG(A) + AVG(B), et ils auront probablement aussi des dénominateurs différents. Vous devriez envelopper les colonnes :AVG(COALESCE(A, 0) + COALESCE(B, 0)) pour résoudre cela, mais peut-être aussi exclure le cas où COALESCE(A, 0) + COALESCE(B, 0).

Sur la base de votre code, je suggérerais :

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;