9
votes

MySQL: moyenne avec les nulls

Y a-t-il un moyen simple que je puisse exclure les nulles de l'affectation de l'AVG? Ils semblent compter comme 0, ce qui n'est pas ce que je veux. Je ne veux tout simplement pas prendre en compte la moyenne, mais ici est la prise, je ne peux pas les laisser tomber à partir du jeu de résultats, car cet enregistrement a des données sur celui-ci que j'ai besoin.

Mise à jour: strong> p>

Exemple: P>

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;


3 commentaires

Quelle langue? Ou faites-vous tout cela dans SQL?


Je ne l'ai pas eu, pourquoi ne pas sélectionner que des enregistrements avec des valeurs non nulles et les avgir?


Les enregistrements qui ont une valeur nulle en moyenne ont une valeur moyenne ont d'autres enregistrements qui ne sont pas nuls et que je dois aussi obtenir ces valeurs. Mes critères sont comme si je veux une moyenne, de Col1 + col2, n'incluant aucune nulle, et je veux un compte (Col3), je vais mettre à jour avec l'exemple.


6 Réponses :


7
votes
AVG(number) 
Is the best way I can think of. This should automatically not include the nulls. Here is a little reading.

2 commentaires

Est-ce la même chose pour numéro1 + numéro2? Parce que je ne comprends pas cela, pour moi, les NULLS semblent compter comme 0, pesant ainsi trop de l'AVG.


@ZOMBIES Non, ce n'est pas la même chose pour une expression d'addition manuelle qui suit les règles NULL normales.



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

2 commentaires

Cela ne va pas tomber les cols où le champ est null? J'ai besoin de ce colon, ce qui fait ce qui rend ce problème.


AVG (COL) est toujours équivalent à la somme (COL) / Count (COL) et les NULLS sont automatiquement exclues. Cette requête renvoie donc toujours les mêmes résultats que Select AVG (champ) à partir de la table.



1
votes

Réponse basée sur la question originale:

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)


0 commentaires

19
votes

fonctions globales (somme, avg, comptage, etc.) dans SQL exclut toujours automatiquement NULL.

SO SUM (COL) / COUNT (COL) = AVG (COL) - C'est génial et cohérent.

Le cas particulier du nombre (*) compte toutes les lignes.

Si vous compensez une expression avec des nulls: A + B Où soit A ou B est null, alors A + B sera null, alors de l'autre colonne étant NULL.

Quand il y a des nulls, en général, avg (A + B) <> AVG (A) + AVG (B), et ils auront probablement différents dénominateurs. Vous devriez envelopper les colonnes: AVG (coalesce (A, 0) + regroupement (B, 0)) pour résoudre ce problème, mais peut également exclure le cas où regrouper (A, 0) + coalesce (B, 0). < / p>

basé sur votre code, je suggérerais: xxx


0 commentaires

1
votes

Il y a une bonne chance que vous puissiez obtenir à la bonne réponse de ce que d'autres ont dit ici, mais au cas où vous n'auriez pas:

Quelles valeurs dans votre table pourraient être nuls? Et que voulez-vous arriver si quelqu'un d'entre eux sont?

Vous ne spécifiez jamais les résultats que vous souhaitez voir si col1 est NULL ou COL2 est NULL, ou s'ils les deux sont nuls, etc.


0 commentaires

0
votes

J'ai récemment utilisé ce truc: xxx

Je crois que l'avertissement est juste ça. Mais cela me fournit la tranquillité d'esprit parce que je sais exactement comment cela fonctionne.

codage heureux


0 commentaires