IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête à "VARIANCE"


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 28
    Par défaut Requête à "VARIANCE"
    Salut,

    J'ai un souci d'erreur que je n'arrive pas à bien expliquer sur une requete pourtant pas compliquée.

    Je vais donner un exemple (qui ne correspond pas à ce que je fais ^^ mais qui reproduit aussi l'erreur) :

    La table (oui, une seule, à trois champs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    |------------ tests ---------|
    |- id_test (PK)              |
    |- gender ('female','male')  |
    |- mark (INT)                |
    |----------------------------|
    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    	gender, MIN(mark) AS m_min, MAX(mark) AS m_max, AVG(mark) AS m_avg
    FROM tests
    WHERE
    		mark 	BETWEEN	(AVG(mark)-SQRT(VARIANCE(mark)))
    				AND		(AVG(mark)+SQRT(VARIANCE(mark)))
    GROUP BY gender;
    L'erreur :
    #1111 - Invalid use of group function
    Pour info, le but de la requête est de ne sélectionner que les notes (marks) situées dans un certain intervalle de confiance : [moyenne-écarttype; moyenne+écarttype].

    Une idée ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 28
    Par défaut
    Je crois que ce que je demande de faire est impossible !
    En fait je demande au milieu de la requête quelque chose que cette requête ne pourra se fournir elle-même qu'à la fin de sa propre exécution...

    Une solution serait alors d'utiliser des sous-requêtes (synchronisées) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    	t1.gender, MIN(t1.mark) AS m_min, MAX(t1.mark) AS m_max, AVG(t1.mark) AS m_avg
    FROM tests t1
    WHERE
    		mark > 0
    	AND
    		mark BETWEEN
    		(SELECT AVG(t2.mark)-SQRT(VARIANCE(t2.mark)) FROM tests t2 WHERE t2.gender=t1.gender)
    		AND
    		(SELECT AVG(t2.mark)+SQRT(VARIANCE(t2.mark)) FROM tests t2 WHERE t2.gender=t1.gender)
    GROUP BY gender;
    qui ralentissent énormément la requête.

    Si quelqu'un a une autre idée, je suis preneur

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    L'idée de la requête ci-dessous est de faire les calculs lourds une seule fois puis d'utiliser le résultat dans la vraie requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t1.gender, MIN(t1.mark) AS m_min, MAX(t1.mark) AS m_max, AVG(t1.mark) AS m_avg
    FROM tests AS t1
    INNER JOIN (
      SELECT gender AS Sexe, AVG(mark) AS Moyenne, SQRT(VARIANCE(mark)) AS EcartType
      FROM tests
      GROUP BY gender
    ) AS t2 ON t1.gender = t2.gender
    WHERE t1.mark > 0
      AND t1.mark BETWEEN (t2.Moyenne - t2.EcartType) AND (t2.Moyenne + t2.EcartType)
    GROUP BY t1.gender
    A essayer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 28
    Par défaut
    Intéressant en effet, je ne savais pas qu'on pouvait utiliser le AS de cette manière !
    Ca pourrait régler le problème
    J'essayerai à l'occasion, si je trouve un moment parce que j'ai avancé mon schmilblick d'une autre manière, et le compteur tourne

    En tout cas merci, je dormirai moins bête ce soir !

Discussions similaires

  1. [MySQL] Insérer résultat d'une requête : problème de quote
    Par maxime17s dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/12/2008, 04h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo