Empécher AVG() de prendre certaines valeurs en compte

Eléphant du PHP | 134 Messages

22 déc. 2006, 16:23

Bonjour,

je vais rentrer directement dans le vif du sujet car ce n'est pas facile de l'expliquer.

Voici un exemple de table "maTable":

Code : Tout sélectionner

----------------------------------------- | ID | VAL | VAL2 | ----------------------------------------- | 1 | 10 | 50 | | 2 | 0 | 25 | | 3 | 30 | 0 | | 4 | 0 | 30 | | 5 | 20 | 0 | -----------------------------------------
EDIT : Pas cool la suppression auto des espaces... :(
Edit de Zeus : faut utiliser les balises [ code ] ;)


et ma requête :

Code : Tout sélectionner

SELECT AVG(VAL2) AS MOY_VAL2, AVG(VAL) AS MOY_VAL FROM maTable
je voudrais modifier ma requête pour récupérer la moyenne des valeurs non nulles de la colonne VAL mais également la moyenne de toutes les valeurs de VAL2.

Le résultat serait :

Code : Tout sélectionner

MOY_VAL = (10 + 30 + 20) / 3 = 20 MOY_VAL2 = (50 + 25 + 30) / 5 = 21
J'ai regarder du coté de IS NOT NULL ou IS NULL() mais je ne trouve rien de concluant

J'espère avoir mis assez de détails.
En vous remerciant... :?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 déc. 2006, 18:29

Attention à ne pas confondre NULL et 0. NULL représente l'absence d'information, et 0 est une information comme une autre, c'est pourquoi IS_NULL() ne t'aidera pas.

Pour ton problème, le mieux est de le prendre le plus simplement du monde, avec une requête par colonne et une clause WHERE pour sélectionner les colonnes ciblées:

Code : Tout sélectionner

SELECT AVG(VAL) AS MOY_VAL FROM maTable WHERE VAL > 0
...puis pareil pour VAL2. Tu pourrais récupérer les deux en une seule requête mais elle serait beaucoup plus compliquée, donc autant aller à l'essentiel :)

Eléphant du PHP | 134 Messages

04 janv. 2007, 13:09

Merci de la réponse

ça m'aurait arrangé de le faire en une seule requête mais bon.

En tous cas ça a le mérite de fonctionner.

Encore merci :D

Bye

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

05 janv. 2007, 01:43

Hey, si ce n'est que ça je peux te le faire en une requête si tu veux :lol:

Code : Tout sélectionner

SELECT (SELECT AVG(VAL) FROM maTable WHERE VAL > 0) AS MOY_VAL, (SELECT AVG(VAL2) FROM maTable WHERE VAL2 > 0) AS MOY_VAL2
Voilà, une requête... :roll: Sachant qu'il est fortement recommandé de créer un index sur VAL et VAL2 et qu'utiliser une requête n'est pas forcément plus rapide ou efficace que deux requêtes.

Eléphant du PHP | 134 Messages

06 janv. 2007, 02:40

Il va falloir que je me penche un peu plus serieusement sur le SQL.

Je ne savais pas qu'on pouvait faire un SELECT dans un SELECT :oops:
Sachant qu'il est fortement recommandé de créer un index sur VAL et VAL2
qu'est ce que tu appelles index??
et qu'utiliser une requête n'est pas forcément plus rapide ou efficace que deux requêtes.
Je n'expliquerais pas mon projet en détail parce que ça serait assez long, mais au vu du traitement php que je fais derrière ça m'aurait s'implifié la vie. :cry:

J'ai un peu la flème de refaire mon script, mais je pense que je ne tarderais pas a tester cette methode.

Bye

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 janv. 2007, 03:58

qu'est ce que tu appelles index??
J'appelle "index" le machin dans que le manuel appelle "index". C'est probablement un des trucs les plus importants à savoir, donc je te recommande fortement de prendre le temps de lire les différents chapitres qui y sont consacrés.

Prends n'importe quel livre ou manuel, au début ou à la fin tu y verras un "index", ben ça sert exactement à ça. À trouver les informations rapidement plutôt que de lire toute l'encyclopédie à chaque fois que tu cherches un seul truc.

Eléphant du PHP | 134 Messages

06 janv. 2007, 13:28

Oulala désolé! :roll:

Je devais être fatigué pour avoir posé cette question. :oops:
En fait j'ai lu qu'il fallait créer un index sur VAL et VAL2 mais je ne sais pas pourquoi j'ai compris qu'il fallait le faire sur MOY_VAL et MOY_VAL2.

Dans ma tête ce n'etait pas clair du tout. Alors c'est pour ça que je ne voyait pas du tout ou tu voulais en venir. Et comme le SQL a encore plens de secret pour moi... :wink: