2010-03-19 7 views
7

Existe-t-il un moyen simple d'exclure les valeurs NULL 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 leur moyenne, mais voici le piège, je ne peux pas les laisser tomber du jeu de résultats, car cet enregistrement contient des données dont j'ai besoin.MySQL: moyennage avec des valeurs nulles

Mise à jour:

exemple:

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; 

Ce travaillerait pour moi, mais les moyennes ne sont pas exactes car ils comptent les valeurs nulles comme 0, ce qui est vraiment jeter au large de la moyenne globale.

+0

Quelle langue? Ou faites-vous tout cela en SQL? –

+0

SQL simple sous MySQL – Zombies

+1

Je ne l'ai pas compris, pourquoi ne pas sélectionner uniquement les enregistrements avec des valeurs non nulles et les avg? – questzen

Répondre

13

Les fonctions d'agrégation (SUM, AVG, COUNT, etc.) dans SQL excluent toujours automatiquement la valeur NULL. Donc, SUM (col)/COUNT (col) = AVG (col) - c'est génial et cohérent.

Le cas spécial de COUNT (*) compte chaque ligne.

Si vous créez une expression avec des valeurs nulles: A + B où A ou B est NULL, alors A + B sera NULL quelle que soit l'autre colonne NULL. Quand il y a des valeurs nulles, en général, AVG (A + B)> AVG (A) + AVG (B), et ils auront probablement des dénominateurs différents, aussi. Vous devrez 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).

En fonction de votre code, je suggère:

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) 

Est le meilleur moyen que je peux penser. Cela devrait automatiquement ne pas inclure les nulls. Here est une petite lecture.

+0

Est-ce la même chose pour number1 + number2? Parce que je n'obtiens pas cela, pour moi les nulls semblent être comptés comme 0, pesant ainsi trop la moyenne. – Zombies

+0

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

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

Link

+0

Cela ne va-t-il pas faire tomber les cols où le champ est nul? J'ai besoin de ce col, qui est ce qui rend cette tâche difficile. – Zombies

+1

AVG (col) est toujours équivalent à SUM (col)/COUNT (col), et les valeurs NULL sont automatiquement exclues, de sorte que cette requête renvoie toujours les mêmes résultats que SELECT AVG (champ) FROM table WHERE othercondition. –

1

réponse basée sur la question initiale:

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) 

Je pense que les nouvelles restrictions, cela fonctionne toujours en théorie, mais pas la manière la plus efficace

1

Il y a une bonne chance que vous serez en mesure d'obtenir la bonne réponse de ce que les autres ont dit ici, mais si vous avez pas:

Les valeurs de votre table PEUVENT être NULL? Et que voulez-vous arriver si l'un d'entre eux sont?

Vous spécifiez jamais ce que les résultats que vous voulez voir si col1 est NULL, NULL ou col2 est, ou si elles les deux se trouvent NULL, etc.

0

J'ai récemment utilisé cette astuce:

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

Je crois que l'avertissement est juste cela. Mais cela me procure une tranquillité d'esprit parce que je sais exactement comment cela fonctionne.

Codage heureux

Questions connexes