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

SQL Firebird Discussion :

Problème sur une requête de classement


Sujet :

SQL Firebird

  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 677
    Points : 953
    Points
    953
    Par défaut Problème sur une requête de classement
    Bonjour a tous
    je suis confronté a un problème qui me voici la structure de mes tables :

    TableEleve(matElev, nomcomplet)
    TableMatiere(idMat, nommat, Coeffmat)
    TableNotes(idnote, matElev, idMat, cc1, cc2,ccExam)

    Comment Avoir pour tout les élèves l'ensemble de ses notes par matières ?
    exemple :
    matricule---- Nom----Matière-----note1-----note2-----exam
    001 devalender francais 12 11 25
    001 devalender Mathematique 10 22 14
    002 latif francais 10 10 10
    002 latif Mathematique 11 11 11

    Merci a tous
    Ps je suis FB 2.5

  2. #2
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut
    SALUT;
    si tu veux la requête qui vous permettre d' afficher le résultat par la façon que vous ayez donné,normalement vous devez utilisez les instructions de jointure comme INNER JOIN ,càd dans votre cas en met:
    SELECT a.matElev,a. nomcomplet,b.nommat,m.cc1,m. cc2,m.ccExamc FROM TableEleve AS a INNER JOIN(TableNotes AS m INNER JOIN TableMatiere AS b ON m.idMat=b.idMat)ON a.matElev=b.matElev.
    voici un cours qui va peut être vous aidez pour apprendre SQL: http://sql.developpez.com/

  3. #3
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par devalender Voir le message
    je suis confronté a un problème qui me
    Ah ?
    Citation Envoyé par devalender Voir le message
    Comment Avoir pour tout les élèves l'ensemble de ses notes par matières ?
    Comme l'a dit samarqand, les jointures sont la réponse à votre question .

    Cela dit, il faudrait affiner un peu :
    1. Vous voulez tous les élèves, même s'il n'ont pas de notes ?
    2. Vous voulez tous les élèves qui ont au moins une matière notée (même partiellement) ?

    Suivant la réponse, ce n'est pas le même type de jointure que l'on va appliquer (INNER JOIN ou LEFT JOIN) et l'ordre des jointures entre tables devient important...

    Quant au lien donné, je reste réservé car l'auteur de cette page ne semble pas comprendre la différence entre la condition de jointure exprimée par le ON de la condition de filtre exprimée par le WHERE.
    Ce lien là est plus précis et en plus il est sur ce site : LE SQL de A à Z : 3e partie - les jointures
    Philippe.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 677
    Points : 953
    Points
    953
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour
    Comme l'a dit samarqand, les jointures sont la réponse à votre question .
    Oui ça je l'ai compris je suis en pleine lecture sur le sujet. Le sujet est vaste et je manque de temps. Mais je suis quand même.

    Citation Envoyé par Ph. B. Voir le message
    Cela dit, il faudrait affiner un peu :
    1. Vous voulez tous les élèves, même s'il n'ont pas de notes ?
    2. Vous voulez tous les élèves qui ont au moins une matière notée (même partiellement) ?
    Je voudrais tous les élèves, même ceux qui non pas de notes !. je suppose que je devrait avoir 0 preux comme moyenne.
    Ensuite je verrai aussi pour les élèves qui ont au moins une matière notée (même partiellement) qui pourrai m'aider pour la suite.

    Citation Envoyé par Ph. B. Voir le message
    Ce lien là est plus précis et en plus il est sur ce site : LE SQL de A à Z : 3e partie - les jointures
    merci aussi pour ce lien.

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut
    salut;
    est ce qu vous avez essayé la requête que j'ai donné ?,normalement celle elle va vous renvoyé tout les lignes(extension)pour les champs qu vous ayez mentionné ,même s'il y a pas de note existe pour les élevés càd le contenu envoyé pour ces champs c'est "null" donc vous devez déclarer les champs des notes "null" lors de la création de table ,comme je vous ais dit la requête donné elle va juste coller les lignes des tables avec celle qui convient tant qu' il y a pas une condition càd en ajoutant un WHERE a la requête pour éliminer des lignes par exemple en va faire un affichage where cc1 not null ,cc2 not null,.. donc le résultat sera tout les élèves qui ont des notes .donc je voie pas ton problème car la requête son WHERE va nous renvoyé les élevés qui ont des notes et qui non pas de notes (le tout.............!!!!!) .
    BON COURAGE

  6. #6
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 677
    Points : 953
    Points
    953
    Par défaut
    Merci pour ton aide !mais j'avoue que j'arrive pas a comprendre ce que tu as écris

  7. #7
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par devalender Voir le message
    Je voudrais tous les élèves, même ceux qui non pas de notes !. je suppose que je devrait avoir 0 preux comme moyenne.
    Ensuite je verrai aussi pour les élèves qui ont au moins une matière notée (même partiellement) qui pourrai m'aider pour la suite.
    Ok, cela dit avec un jeu d'essai représentatif de tous les cas que l'on peut trouver dans la base de données et le résultat attendu pour le jeu d'essai, on pourrait lever les dernières ambiguïtés...
    Actuellement, on ne sait pas si les lignes de notes sont toutes présaisies à NULL pour chaque élève ET chaque matière, OU si elles sont créées au fil de l'eau (= lors de la saisie des notes).
    Je suis donc parti sur ce 2° cas qui me parait le plus probable. On a donc le jeu d'essai suivant

    TABLEELEVE(MATELEVE, NOMCOMPLET)
    001, Devalender
    002, Latif
    003, Dupond
    004, Martin

    TABLEMATIERE(IDMAT, NOMMAT, COEFFMAT)
    1, Français, 1
    2, Mathématiques, 1
    3, Anglais, 1

    TABLENOTES(IDNOTE, MATELEV, IDMAT, CC1, CC2, CCEXAM)
    1, 001, 1, 12, 11, 15
    2, 001, 2, 10, 22, 14
    3, 002, 1, 10, 10, 10
    4, 002, 2, 11, NULL, NULL
    5, 003, 1, 14, NULL, NULL

    Remarques :
    1. Aucune note d'anglais n'a été saisie,
    2. Les notes de mathématique de "DUPOND" n'ont pas été saisies,
    3. Aucune note dans aucune matière n'a été saisie pour "MARTIN"


    Si j'applique la 1° requête SQL proposée et un peu corrigée, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT E.mateleve, E.nomcomplet, M.nommat, N.cc1, N.cc2, N.ccexam
    FROM tableeleve E
    INNER JOIN tablenotes N ON N.matelev = E.mateleve
    INNER JOIN tablematiere M ON M.idmat = N.idmat
    ORDER BY E.mateleve, M.nommat
    Résultat:
    MATELEVE NOMCOMPLET NOMMAT CC1 CC2 CCEXAM
    001, Devalender, Français, 12, 11, 15
    001, Devalender, Mathématiques, 10, 22, 14
    002, Latif, Français, 10, 10, 10
    002, Latif, Mathématiques, 11, NULL, NULL
    003, Dupond, Français, 14, NULL, NULL

    J'obtiens tous les élèves qui ont eu au moins une note, mais "MARTIN" pour qui on n'a rien saisi n'apparait pas ! . Accessoirement, on constate que l'on a pas saisi les notes de "Mathématique" pour l'élève "DUPOND"...
    En effet, INNER JOIN ne retourne que les lignes qui ont pu être mises en correspondance.

    Pour récupérer tous les élèves, que leurs notes aient été saisies (même partiellement) ou pas, il faut utiliser un autre type de jointure , dite externe gauche ou LEFT OUTER JOIN, le terme OUTER étant facultatif. Avec ce type de jointure, on va ramener toutes les lignes de la 1° table ou table de gauche (d'où le LEFT) et NULL pour les correspondances qui n'ont pu être réalisées. Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT E.mateleve, E.nomcomplet, M.nommat, N.cc1, N.cc2, N.ccexam
    FROM tableeleve E
    LEFT JOIN tablenotes N ON N.matelev = E.mateleve
    LEFT JOIN tablematiere M ON M.idmat = N.idmat
    ORDER BY E.mateleve, M.nommat
    Résultat :
    MATELEVE NOMCOMPLET NOMMAT CC1 CC2 CCEXAM
    001, Devalender, Français, 12, 11, 15
    001, Devalender, Mathématiques, 10, 22, 14
    002, Latif, Français, 10, 10, 10
    002, Latif, Mathématiques, 11, NULL, NULL
    003, Dupond, Français, 14, NULL, NULL
    004, Martin, NULL, NULL, NULL, NULL

    Si ensuite on veut tous les élèves, toutes les matières notées ou pas, il faudra écrire une requête un tant soit peu différente (produit cartésien de la table des élèves par celle des matières, et une jointure externe gauche sur la table des notes.
    Philippe.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 677
    Points : 953
    Points
    953
    Par défaut
    Et merci pour cette explication claire qui va me permettre d'avancer dans la compréhension et aussi dans mon projet.

    j'ai une dernière question concernant ce point.

    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    Actuellement, on ne sait pas si les lignes de notes sont toutes présaisies à NULL pour chaque élève ET chaque matière, OU si elles sont créées au fil de l'eau (= lors de la saisie des notes).
    J'ai pas bien compris le principe "de présaisies à NULL". samarqand en parlait aussi:
    même s'il y a pas de note existe pour les élevés càd le contenu envoyé pour ces champs c'est "null" donc vous devez déclarer les champs des notes "null" lors de la création de table
    Pouvez vous m'éclairer sur ce point ?

    Merci beaucoup.

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par devalender Voir le message
    J'ai pas bien compris le principe "de présaisies à NULL".

    Pouvez vous m'éclairer sur ce point ?
    Je doute que ce principe de "pré saisies" soit le fonctionnement retenu, je ne le trouve pas judicieux.

    Mais, reprenons tout d'abord le modèle de données et supposons que l'on enregistre le fait qu'un élève soit inscrit à une matière. On aura:
    TableEleve(matElev, nomcomplet)
    TableMatiere(idMat, nommat, Coeffmat)
    TableInscrit(matElev, idMat)
    TableNotes(idnote, matElev, idMat, cc1, cc2,ccExam)

    Dès que je vais saisir une ligne indiquant qu'un élève est inscrit à une matière, je vais saisir une ligne de notes dont les valeurs seront indéfinies (NULL).
    Exemple:
    TABLEELEVE(MATELEVE, NOMCOMPLET)
    001, Devalender
    002, Latif
    003, Dupond
    004, Martin

    TABLEMATIERE(IDMAT, NOMMAT, COEFFMAT)
    1, Français, 1
    2, Mathématiques, 1
    3, Anglais, 1

    TABLEINSCRIT(MATELEVE, IDMAT)
    001, 1
    001, 2
    002, 2
    003, 3

    TABLENOTES(IDNOTE, MATELEV, IDMAT, CC1, CC2, CCEXAM)
    1, 001, 1, NULL, NULL, NULL
    2, 001, 2, NULL, NULL, NULL
    3, 002, 2, NULL, NULL, NULL
    4, 003, 3, NULL, NULL, NULL

    Les lignes étant pré-saisies, une requête avec jointure interne peut être utilisée.

    Cela dit, la définition de la table des notes ne me parait pas judicieuse : on est limité à 3 notes dont une d'examen par matière. On est assez éloigné d'un modèle normalisé. J'aurais plutôt écrit : TABLENOTES(IDNOTE, MATELEV, IDMAT, ORDRE, NOTE)...
    Philippe.

  10. #10
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 677
    Points : 953
    Points
    953
    Par défaut
    Bonjour Ph. B.

    Merci pour la réponse sur le principe des pré-saisies.
    j'avoue que c'est pas accrocheur ! pour la table note vous avez en effet raison.
    En faite j'ai juste basé mon analyse sur une règle de gestion.
    Dans tous les cas il faut bien que je fasse évoluer pour ne pas être caduque quand la règle changera.
    Maintenant dans votre proposition de la table Note que représentera le champ ordre ?
    Merci

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Ordre aurait pu être "date du devoir" , dans la table TABLENOTES proposée il n'est pas non plus indiqué si c'est un exam ou un contrôle continu
    Deux remarques :
    - Tous les devoirs d'une même matière ont-ils le même coefficient ?
    - Les devoirs "manquants" pour un élève peuvent être justifiés (maladie par exemple) et donc non pris dans la moyenne générale) alors que d'autres peuvent être "séchés" => zéro pointé ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par devalender Voir le message
    Maintenant dans votre proposition de la table Note que représentera le champ ordre ?
    L'ordonnancement des notes tout simplement : 1 pour la 1° note, 2 pour la 2°, etc. J'aurais pu employer le mot RANG à la place.

    J'aurais pu également indiquer la date du contrôle comme l'a justement suggéré SergioMaster.
    Philippe.

  13. #13
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 677
    Points : 953
    Points
    953
    Par défaut
    MERCI à vous pour toutes ses indications.

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

Discussions similaires

  1. problème sur une requête imbriquée
    Par pbatty1 dans le forum Requêtes
    Réponses: 12
    Dernier message: 26/10/2007, 17h21
  2. problème sur une requête mysql
    Par atomikado dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/10/2007, 16h04
  3. [Optimisation] Problème sur une requête UNION.
    Par françois62 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2005, 16h08
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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