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

Langage SQL Discussion :

problème de jointure je pense


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 59
    Points : 55
    Points
    55
    Par défaut problème de jointure je pense
    Bonjour,

    Je n'arrive pas à réaliser une requêtes de jointure, je suis pas doué sur ce niveau pourtant j'ai essayer de comprendre à l'aide du tuto " sqlpro " sur le forum.

    Je m'explique, j'ai 2 tables :

    resultats: ( table permettant de recevoir les notes )

    id_res - score - id_eval - id_question
    -----------------------------------
    1--------8--------2----------1
    2--------4--------2----------2
    3--------5--------2----------1
    4--------6--------2----------4

    et la table questions :


    id_question - Lib_quest
    -------------------
    1-------------libel 1
    2-------------libel 2
    3-------------libel 3
    4-------------libel 4

    J'aimerai réaliser la moyenne obtenu pour chaque question en groupant les utilisateurs mais le problème est que je voudrais obtenir un zero quand la question n'a pas été remplis.
    Pour le moment j'affiche toute les questions sauf la 3eme car elle n'apparait pas dans la table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  * 
    FROM resultats res
    LEFT  OUTER  JOIN questions q ON res.id_question = q.id_question
    WHERE id_question IS  NULL
    J'ai essayé ça mais ca ne me retourne rien :s

  2. #2
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Avec les jointures ANSI92 il faut dans certains cas perdre l'habitude que l'on avait lorsqu'on utilisait les jointures avec WHERE, c'est-à-dire ne pas tout le temps continuer à mettre les filtres dans le WHERE. Il faut les mettre alors

    • ou dans le LEFT JOIN: si tu veux exclure les questions non répondues sans perdre d'éléments de la table maître
    • ou dans un CASE WHEN IS NULL au niveau du select si tu veux traiter l'absence d'élément.


    Je te proposes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  id_eval, AVG (CASE WHEN res.id_question IS NULL THEN 0 ELSE res.score END)
    FROM questions q
    LEFT  OUTER  JOIN resultats res ON q.id_question = res.id_question
    GROUP BY id_eval
    Petites remarques sinon: Tu as oublié l'alias de id_question à la fin, on ne sait pas s'il s'agit de la table resultat ou question. Tu t'es trompé de sens pour la jointure externe, ce qui t'importe c'est d'avoir toutes les questions de bases même celles auxquelles il n'y a pas de réponses.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 59
    Points : 55
    Points
    55
    Par défaut
    merci de m'éclairer un peu plus :p

    J'ai rajouté des conditions à ma requêtes car je l'avais simplifié pour le forum.
    un manager est évalué par des évaluateurs qui possedent un statut et un état.
    Moi je veux faire la moyenne par statut pour chaque questions

    J'ai donc établi cette requête en suivant ton conseil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT resultats.id_question AS Question, AVG( 
    CASE  WHEN resultats.score IS  NULL 
    THEN 0 
    ELSE resultats.score
    END  ) 
    FROM evaluateurs, questions
    LEFT  OUTER  JOIN resultats ON questions.id_question = resultats.id_question
    WHERE evaluateurs.id_manager =8
    AND evaluateurs.id_eval = resultats.id_eval
    AND evaluateurs.etat =1
    AND evaluateurs.id_statut =3
    AND questions.id_dim =1
    GROUP  BY questions.id_question
    LIMIT 0 , 30
    Le problème est que je n'arrive toujours pas à avoir la moyenne de la question que l'évaluateur du statut 3 n'a pas remplie.
    Par contre j'ai bien la moyenne des autres questions
    et en changeant LEFT par RIGHT je ne vois pas de différence.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    C'est normal vous filtrez dans le WHERE. Vous êtes en train de dire je veux des NULL (jointure externe) = une valeur. Cela élimine donc les NULL et vous revenez à la case départ !

    faites quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT R.id_question AS Question, 
           AVG(CASE  
                  WHEN R.score IS  NULL THEN 0 
                  ELSE R.score
           END) 
    FROM   evaluateurs E
           CROSS JOIN questions Q
           LEFT OUTER JOIN resultats R
                ON Q.id_question = R.id_question
                   AND E.id_eval = R.id_eval
    WHERE  E.id_manager =8
      AND  E.etat =1
      AND  E.id_statut =3
      AND  Q.id_dim =1
    GROUP  BY Q.id_question
    A +

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 59
    Points : 55
    Points
    55
    Par défaut
    Sa fonctionne !!! Serieusement je suis épaté, j'ai encore du chemin à faire ^^
    Sa me fait doucement rire le " CROSS JOIN " je connaissai pas,
    par contre je récupere la valeur NULL au lieu de récupérer l'ID de la question manquante. Bref c'est pas trop important. Merci beaucoup

  6. #6
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Le CROSS JOIN c'est l'équivalent de FROM TABLE1,TABLE2 sans jointure, c'est-à-dire un produit cartésien. Tu as du en faire, et même quelques fois involontairement, sans savoir que c'était un CROSS JOIN.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de jointure.. je pense.
    Par FMaz dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 19/12/2005, 22h36
  2. Probléme de jointure
    Par Ajrarn dans le forum Langage SQL
    Réponses: 14
    Dernier message: 24/02/2005, 15h57
  3. Vraisemblable problème de jointure
    Par pimousse76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 16h34
  4. [MS Access] Problème de jointure
    Par Erakis dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2005, 22h15
  5. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 12h27

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