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 :

[SQL] Calculer moyenne des etudients sur un module et sur la formation


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut [SQL] Calculer moyenne des etudients sur un module et sur la formation
    Bonjour,

    Je n arrive pas a me sortir de mon probleme desole. Comme vous pouvez le voir, dans le screenshot que j ai mis en fichier joint, j ai quatres tables qui sont en relations. J essaye de comprendre comment je pourrais faire une query permettant d obtenir le score de chaque eleve par module (donc une moyenne sur les assessments*leurpourcentage associe) et faire une query qui determine la moyenne de l etudient sur toute la formation (donc en fait, multiplier le resultqt de la query precedente par le coefficient de chaque module et de sommer le resultat sur tout les modules.

    (bien sur pour plus de facilite, mon attribut Weight qui represente le poids de chaque Assessment et l attribut Coefficient qui represente lui le poids de chaque module dqns a formation sont du style : si c 30% => 0.3)

    Je ne c pas si mon probleme est clair.

    Pour calculer l apport de chaque assessment a la note finale sur le module, je pense au il me faut faire ca et encore suis pas sur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT SAM.Score * A.Weight AS Influence_Per_Assessment[/FONT]
    FROM tblAssessment AS A, tblStudentAssessmentModule AS SAM
    WHERE SAM.AssessmentID = A.AssessmentID;
    Mais ensuite me faut faire la somme de ce resultat sur chaque Assessment du module (donc utiliser un GROUP BY SAM.StudentID, SAM.ModuleID) mais je ne vois pas concretement comment l ecrire.

    ENfin voila, je galere. Si quelqu un pouvait m aider. Bien sur vous l aurez compris, je debute dans les Queries.
    Images attachées Images attachées  

  2. #2
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Pour la moyenne pour chaque eleve sur chaque module

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT SAM.StudentID, SAM.ModuleID, SUM(
        SELECT SAM.Score * A.Weight AS Influence_Per_Assessment
        FROM tblAssessment AS A, tblStudentAssessmentModule AS SAM
        WHERE SAM.AssessmentID = A.AssessmentID) AS Average_Per_Module
    FROM tblStudentAssessmentModule AS SAM
    GROUP BY SAM.StudentID, SAM.ModuleID;

    Je fais totalement fausse route en reflechissant comme ca ?
    Merci

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Alors, si je comprends bien, il te faut deux requêtes :

    la première te renvoie :
    Students.*, Module.*, SOMME(SAM.Note*Assessment.Weight)

    pour chaque étudiant et module

    et la seconde :
    Students.*, SOMME(SOMME(SAM.Note*Assessment.Weight)*Module.Coeficient)/SOMME(Module.Coeficient)


    ?

    Dans ce cas, je pense qu'il te faudra passer par les vues ou par une table temporaire pour plus de simplicité
    Sinon il faudra passer par une sous-requête...

    Je vais essayer de te proposer les deux solutions

    Avec Table Temporaire ou Vue

    Table temporaire ou Vue :
    StudentID, ModuleID, Average

    requête 1 (qui remplie la table temporaire, ou la vue) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SAM.StudentID, SAM.ModuleID, SUM(SAM.Score * A.Weight) AS Average
    FROM tblStudentAssessmentModule AS SAM
    <div style="margin-left:40px">INNER JOIN tblAssessment AS A
    <div style="margin-left:40px">ON SAM.AssessmentID = A.AssessmentID</div></div>GROUP BY SAM.StudentID, SAM.ModuleID
    requête 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TT.StudentID, SUM(TT.Average * M.Coeficient)/SUM(M.Coeficient) As Average
    FROM tblTemp AS TT
    <div style="margin-left:40px">INNER JOIN tblModule AS M
    <div style="margin-left:40px">ON TT.ModuleID = M.ModuleID</div></div>GROUP BY TT.StudentID
    Voici la version avec sous requête (donc seulement requête 2, pas de table temporaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT SAM.StudentID, SUM(
    <div style="margin-left:40px">(SELECT SUM(SAM2.Score * A.Weight)
    FROM tblStudentAssessmentModule AS SAM2
    <div style="margin-left:40px">INNER JOIN tblAssessment AS A
    <div style="margin-left:40px">ON SAM2.AssessmentID = A.AssessmentID</div></div>WHERE SAM2.StudentID = SAM.StudentID AND SAM2.ModuleID = M.ModuleID)</div>* M.Coeficient)/SUM(M.Coeficient) As Average
    FROM tblStudentAssessmentModule AS SAM
    <div style="margin-left:40px">INNER JOIN tblModule AS M
    <div style="margin-left:40px">ON SAM.ModuleID = M.ModuleID</div></div>GROUP BY SAM.StudentID
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  4. #4
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Merci de m aider Swoög, c super sympa.

    Tu as tres bien compris mes requetes.

    Par contre pour pas rester con, j aurais quelques questions.

    1) dans ton analyse de la 2ieme requete, tu consideres les coefficients comme etant 7, 8 ... des nombres quoi et pqs des pourcentqges non ? Si oui, ca m arrange, j avais abandonne cette option pour plus de simplicite.

    2) Tu utilises un join dans la premiere requete, pour preparer le terrain pour la deuxieme non ? Car juste pour repondre a la premiere requete, mon code etait bon non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <div style="text-align: left;">SELECT SAM.StudentID, SAM.ModuleID, SUM(
        SELECT SAM.Score * A.Weight AS Influence_Per_Assessment
        FROM tblAssessment AS A, tblStudentAssessmentModule AS SAM
        WHERE SAM.AssessmentID = A.AssessmentID) AS Average_Per_Module
    FROM tblStudentAssessmentModule AS SAM
    GROUP BY SAM.StudentID, SAM.ModuleID;</div>
    3) Je comprend ta premiere solution pour la premiere solution de la deuxieme requete, sauf aue je c pas d ou sort le tblTemp. Il est genere automatiquement a l issu de la premiere requete ?
    (desole j ai pas encore etudier les vues)


    Ta deuxieme solution pour la deuxieme requete vas me demander un peu plus de temps pour la saisir.
    Quoi qu il en soit encore merci de m aider Swoög, ca a du te demander un peu de temps.

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    alors
    Citation Envoyé par Slumpy
    1) dans ton analyse de la 2ieme requete, tu consideres les coefficients comme etant 7, 8 ... des nombres quoi et pqs des pourcentqges non ? Si oui, ca m arrange, j avais abandonne cette option pour plus de simplicite.
    par pourcentages... tu veux dire que la somme est toujours égale à 1 ? il n'y a pas besoin de diviser par la somme des coeficients ?

    dans ce cas, il te suffit de retirer la partie "/SUM(M.Coeficient)" de la requête

    Citation Envoyé par Slumpy
    2) Tu utilises un join dans la premiere requete, pour preparer le terrain pour la deuxieme non ? Car juste pour repondre a la premiere requete, mon code etait bon non ?
    non, le join est là pour remplacer la sous-requête (c'est meilleur niveau performances, et plus clair niveau sémantique )

    ta requête part sur une bonne idée, sauf quelques points :
    • deux tables ont le même alias
    • il te faut de toutes façons une jointure dans la sous-requête
    • tu n'établies aucune correspondances entre la requête principale et la sous-requête alors qu'il y en a une
    • le groupage se fait en tant que filtrage dans la sous-requête : c'est la relation de correspondance entre les deux requêtes

    Voici une version corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SAM.StudentID, SAM.ModuleID, SUM(
    <div style="margin-left:40px">SELECT SAM2.Score * A.Weight AS Influence_Per_Assessment
    FROM tblStudentAssessmentModule AS SAM2 <div style="margin-left:40px">INNER JOIN  tblAssessment AS A <div style="margin-left:40px">ON A.AssessmentID = SAM2.AssessmentID</div></div>WHERE SAM2.StudentID = SAM.StudentID AND SAM2.ModuleID = SAM.ModuleID</div>) AS Average_Per_Module
    FROM tblStudentAssessmentModule AS SAM
    Comme tu le vois, tu as ici SOUS-REQUETE + JOINTURE dans la SSREQ + WHERE
    au lieu de JOINTURE + GROUP BY
    D'ailleurs cette requête se rapproche un peu de celle que je t'ai proposé pour la seconde requête dans le cas où il n'y a pas de table temporaire
    Citation Envoyé par Slumpy
    3) Je comprend ta premiere solution pour la premiere solution de la deuxieme requete, sauf aue je c pas d ou sort le tblTemp. Il est genere automatiquement a l issu de la premiere requete ?
    (desole j ai pas encore etudier les vues)
    la table tblTemp est une table qui contient le résultat de la première requête.
    les vues fonctionnent sur le principe de la table temporaire sauf qu'il y a gestion automatique (elle n'existe que quand on fait appelle à la vue, cela permet d'avoir une table toujours à jour, et de faire en même temps des économies d'espace de stockage )

    Citation Envoyé par Slumpy
    Quoi qu il en soit encore merci de m aider Swoög, ca a du te demander un peu de temps.
    De rien

    Le principal est de bien voir ce que tu veux, ensuite, en général les champs et la requête apparaissent d'eux même ^^

    il y a juste quelques points à se souvenir : préférer les jointures aus sous-requête quand c'est possible...

    Essayer de faire au plus simple... ou au moins compliquer

    décortiquer le problème en problèmes plus simple ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    par pourcentages... tu veux dire que la somme est toujours égale à 1 ? il n'y a pas besoin de diviser par la somme des coeficients ?

    dans ce cas, il te suffit de retirer la partie "/SUM(M.Coeficient)" de la requête
    Oui, mais bon je preferre autant comme t as fait ^^


    deux tables ont le même alias
    Ces deux tables sont pourtant les memes non ?


    la table tblTemp est une table qui contient le résultat de la première requête.
    les vues fonctionnent sur le principe de la table temporaire sauf qu'il y a gestion automatique (elle n'existe que quand on fait appelle à la vue, cela permet d'avoir une table toujours à jour, et de faire en même temps des économies d'espace de stockage )
    Donc je peux enchainer les deux requetes comme tu les as ecrite, j ai rien besoin de definir entre ?

    Je veux me pencher un peu sur le Inner Join car je capte pas tout. Mais merci encore.

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Slumpy
    Ces deux tables sont pourtant les memes non ?
    oui, mais elle ne désignes pas la même chose dans la requête, ce n'est pas la même source de donnée


    Citation Envoyé par Slumpy
    Donc je peux enchainer les deux requetes comme tu les as ecrite, j ai rien besoin de definir entre ?
    non, il faut que tu crée la table si tu veux l'utiliser...
    ensuite, ça dépend de ton SGBD, peut-être qu'il permet d'utiliser les vues, ce qui serait plus simple...

    sinon, il faut que tu fasses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE tblTemp ... ;
     
    TRUNCATE tblTemp;
     
    INSERT INTO tblTemp SELECT [requete 1];
     
    SELECT [requete 2];
    Je ne suis pas sûr que le create et le truncate soient standards, il faut vérifier avec ton SGBD, TRUNCATE sert à vider la table : le mieux est que la table soit créée une fois pour toutes et vider/reremplie à chaque fois...

    enfin, c'est pas le mieux, mais au moins t'es sûr d'avoir une table à jour

    si tu utilises la méthode des tables temporaires...

    Je veux me pencher un peu sur le Inner Join car je capte pas tout. Mais merci encore.[/QUOTE]
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Si j'ai bien compris la question (entre autres que les coefficients et poids font un total de 1) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT SAM.StudentID, SAM.ModuleID, SUM(SAM.Score * A.Weight) AS Moyenne
    FROM tblStudentAssessmentModule SAM INNER JOIN tblAssessment A
                                              ON SAM.AssessmentID = A.AssessmentID
    GROUP BY SAM.StudentID, SAM.ModuleID
    UNION ALL
    SELECT SAM.StudentID, NULL, SUM(SAM.Score * A.Weight * M.Coefficient) 
    FROM tblStudentAssessmentModule SAM INNER JOIN tblAssessment A
                                              ON SAM.AssessmentID = A.AssessmentID
                                        INNER JOIN tblModule M
                                              ON SAM.ModuleID = M.ModuleID
    GROUP BY SAM.StudentId
    Cette requête devrait donner une ligne par module plus une ligne de moyenne globale (avec ModuleId = NULL), pour avoir la moyenne globale sur les lignes des moyennes par module, il suffit d'encapsuler l'union précédente (avec une modification mineure).
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  9. #9
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    En effet,

    Arf, j'ai encore vu trop compliqué... en effet... de multiplier dans ou hors de la somme est sans importance... J'ai oublié la distributivité...

    ce qui fait qu'on peut remplacer la table temporaire (ou la sous-requête) de ma seconde requête par une jointure...

    et qui évite tout ce *******

    Bravo Mediat (et désolé Slumpy d'avoir oublié une simplification aussi basique )

    Il y a là les deux requêtes en une...
    Je pense que ça te conviendra mieux que mes bidouilles ...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  10. #10
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Coucou Swoög et Médiat, et merci a vous.

    Je crois que je commence a y voir un peu plus clair. Verifions :

    1) Si je fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SAM.StudentID, SAM.ModuleID, SUM(SAM.Score * A.Weight) AS Moyenne
    FROM tblStudentAssessmentModule AS SAM INNER JOIN tblAssessment AS A
                                              ON SAM.AssessmentID = A.AssessmentID
    GROUP BY SAM.StudentID, SAM.ModuleID
    Je repond a ma premiere requete, c'est a dire, je vais avoir tout mes etudients avec tous mes modules et leur moyenne associée.



    2) Et si je fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SAM.StudentID, SUM(SAM.Score * A.Weight * M.Coefficient) 
    FROM tblStudentAssessmentModule AS SAM INNER JOIN tblAssessment AS A
                                              ON SAM.AssessmentID = A.AssessmentID
                                        INNER JOIN tblModule M
                                              ON SAM.ModuleID = M.ModuleID
    GROUP BY SAM.StudentId
    Je repond a ma deuxieme requete, a savoir j aurais une ligne pour chaque etudient avec ca moyenne generale c ca ?



    3)si je veux utiliser des poids plutot qu'un pourcentage pour les coeff des modules, je dis une connerie avec le code suivant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SAM.StudentID, NULL, SUM(SAM.Score * A.Weight * M.Coefficient/SUM(M.Coeficient)) 
    FROM tblStudentAssessmentModule SAM INNER JOIN tblAssessment A
                                              ON SAM.AssessmentID = A.AssessmentID
                                        INNER JOIN tblModule M
                                              ON SAM.ModuleID = M.ModuleID
    GROUP BY SAM.StudentId


    4) Si par exemple je veux la liste des noms, prenoms et moyenne de ceux qui ont reussi (suis pas sur pour celle la )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      SELECT S.Surname, S.FirstName, SUM(SAM.Score * A.Weight * M.Coefficient/SUM(M.Coeficient)) AS Average
      FROM tblStudentAssessmentModule AS SAM INNER JOIN tblAssessment AS A
                                                ON SAM.AssessmentID = A.AssessmentID
                                          INNER JOIN tblModule AS M
                                                ON SAM.ModuleID = M.ModuleID
                                        INNER JIN tblStudent AS S
                                            ON SAM.StudentID = S.StudentID
      WHERE Average >= 10
      GROUP BY SAM.StudentId 
      ORDER BY Surname, Firstname;


    Et bien sur :
    désolé Slumpy d'avoir oublié une simplification aussi basique
    Ne t excuses pas tu m aides bcp ^^. C'est plutot moi qui m excuse d'etre aussi mauvais.

  11. #11
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    tu as bien compris pour tout il y a juste une petite simplification que tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(SAM.Score * A.Weight * M.Coefficient/SUM(M.Coeficient))
    peut devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(SAM.Score * A.Weight * M.Coefficient)/SUM(M.Coeficient)
    c'est du même ordre que celle que j'avais oublié, avantage : tu ne fais la division et la somme des coeficients qu'une seule fois au lieu de le faire à chaque fois ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  12. #12
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    J ai bien compris pour tout ? woaw j'aurais pas cru que le coup de

    Dans le point 4) soit correct.

    Je commence a comprendre c cool ^^ milles merci.

  13. #13
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Arf, tu fais bien de souligner ceci...

    en effet, Average n'existe pas pendant la création de la requête... uniquement après...

    il faut donc faire le tri non pas sur ce qui est contenu dans les tables (WHERE) mais sur le résultat final, il faut donc utiliser HAVING :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      SELECT S.Surname, S.FirstName, SUM(SAM.Score * A.Weight * M.Coefficient/SUM(M.Coeficient)) AS Average
      FROM tblStudentAssessmentModule AS SAM INNER JOIN tblAssessment AS A
                                                ON SAM.AssessmentID = A.AssessmentID
                                          INNER JOIN tblModule AS M
                                                ON SAM.ModuleID = M.ModuleID
                                        INNER JIN tblStudent AS S
                                            ON SAM.StudentID = S.StudentID
      GROUP BY SAM.StudentId 
      ORDER BY Surname, Firstname
      HAVING Average >= 10;
    tu as bien fait de le souligner ^^
    pour le reste c'est bon (j'ai revérifié ^^)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  14. #14
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Coucou,
    C'est encore moi et mes questions, desolé.
    (Merci pour le HAVING, j avais pas compris la difference avec le WHERE, now oui ^^)

    Sinon pour changer, j ai une interrogation. Cette query est il juste ? (Je pense notamment au fait de declarer un AS dans le calcul de la somme dans le COUNT, et d'utiliser cette reference Average dans un having).

    Tu l'auras compris le but de cette query est de donner le nombre de recalé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT COUNT(SUM(SAM.Score * A.Weight * M.Coefficient/SUM(M.Coefficient)) AS Average) AS Number_of_Student_Who_Failed 
      FROM tblStudentAssessmentModule AS SAM INNER JOIN tblAssessment AS A
                                                   ON SAM.AssessmentID = A.AssessmentID
                                                        INNER JOIN tblModule M
                                                   ON SAM.ModuleID = M.ModuleID
      GROUP BY SAM.StudentId 
      HAVING Average < 10;

  15. #15
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Alors, je ne sais effectivement pas si le AS sera accepté... en même temps... pourquoi pas... c'est vrai que ç'a pas l'air très correct vu comme ça...

    mais de plus, le COUNT ne doit avoir lieu que pour les Average > 10...

    donc il ne faut pas que le tri soit fait sur le résultat final de la requête (sinon le count a déjà eu lieu ) il faut que ce soit fait pendant les calculs, donc dans un WHERE voici une version qui fonctionnera certainement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT COUNT(SUM(SAM.Score * A.Weight * M.Coefficient)/SUM(M.Coefficient)) AS Number_of_Student_Who_Failed 
      FROM tblStudentAssessmentModule AS SAM INNER JOIN tblAssessment AS A
                                                   ON SAM.AssessmentID = A.AssessmentID
                                                        INNER JOIN tblModule M
                                                   ON SAM.ModuleID = M.ModuleID
      WHERE (SUM(SAM.Score * A.Weight * M.Coefficient)/SUM(M.Coefficient)) < 10
      GROUP BY SAM.StudentId
    Je ne peux garantir que ça fonctionne... mais je pense qu'il y a plus de chances

    en même temps.. il faut faire attention avec le GROUP BY... ce n'est pas totalement sûr qu'il fonctionne comme voulu...

    dans le cas présent en fait, il y a deux calculs qui mettent en jeu des groupements différents (et cette fois ce n'est pas simplifiable)

    dans ce cas, il faut très certainement passer par une sous-requête... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COUNT(*) AS Number_of_Student_Who_Failed 
    FROM (<div style="margin-left:40px">SELECT SUM(SAM.Score * A.Weight * M.Coefficient)/SUM(M.Coefficient) AS Average
    FROM tblStudentAssessmentModule AS SAM
    <div style="margin-left:40px">INNER JOIN tblAssessment AS A<div style="margin-left:40px">ON SAM.AssessmentID = A.AssessmentID</div>INNER JOIN tblModule M
    <div style="margin-left:40px">ON SAM.ModuleID = M.ModuleID</div></div>GROUP BY SAM.StudentId</div>)
    WHERE Average < 10
    PS : n'oublie pas de séparer les deux sommes dans ton calcul plutôt que de les imbriquer
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  16. #16
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Arf,

    J aurais du penser a un WHERE a la place du HAVING sorry .

    Par contre, sur Ce post la, tu m as un peu perdu .


    Je ne suis pas sur de comprendre ce que tu dis la :

    dans le cas présent en fait, il y a deux calculs qui mettent en jeu des groupements différents (et cette fois ce n'est pas simplifiable)
    les deux calculs, c le COUNT qui doit se faire sur le Average, et le SUM qui doit se faire sur les StudentID ?


    Je ne comprends pas ca non plus :
    PS : n'oublie pas de séparer les deux sommes dans ton calcul plutôt que de les imbriquer
    La j ai pas d idee par contre. (Car si c au sujet des deux SUM, depuis le debut on les a mis comme ca.

    Enfin, j ai une derniere query dont je ne suis pas sur. Elle a pour but de donner les moyennes sur chaque module de Jean Dupont. (Je m interroge sur la succession de AND and un ON d'INNER JOIN)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      SELECT SAM.ModuleID, SUM(SAM.Score * A.Weight) AS Average
      FROM tblStudentAssessmentModule AS SAM INNER JOIN tblAssessment AS A
                                          ON SAM.AssessmentID = A.AssessmentID
                                       INNER JOIN tblStudent AS S
                                          ON SAM.StudentID = S.StudentID AND S.Surname=’Dupont’ AND S.Firstname=’Jean’
     
      GROUP BY SAM.StudentID, SAM.ModuleID
      ORDER BY ModuleID

    Je sais que je ne fais que le dire, mais merci encore de ta part, c super sympa. Surtout que tu ne fais pas que pondre du code, mais que tu prends le temps d expliquer.

  17. #17
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Slumpy
    les deux calculs, c le COUNT qui doit se faire sur le Average, et le SUM qui doit se faire sur les StudentID ?
    il y a le calcule de la moyenne, qui se fait en tenant compte du GROUP BY et sans tenir compte du WHERE
    et le compte des lignes trouvées, qui se fait sans tenir compte du GROUP BY mais en tenant compte du WHERE (qui est fait sur le resultat du calcul précédant)

    Citation Envoyé par Slumpy
    [pour les SUM]La j ai pas d idee par contre. (Car si c au sujet des deux SUM, depuis le debut on les a mis comme ca.
    non, je t'avais conseillé de les séparé un peu plus haut, ça diminue le nombre de calcul

    Citation Envoyé par Slumpy
    Je sais que je ne fais que le dire, mais merci encore de ta part, c super sympa. Surtout que tu ne fais pas que pondre du code, mais que tu prends le temps d expliquer.
    Juste filer du code sans l'expliquer, ça aide jamais à faire progresser les autres, c'est quand même un peu pour cette raison que je participe au forum

    et puis ça fait plaisir de voir quelqu'un qui a envie de comprendre, pas juste que ça marche (même ici, c'est pas si courant que ça ^^)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  18. #18
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    il y a le calcule de la moyenne, qui se fait en tenant compte du GROUP BY et sans tenir compte du WHERE
    et le compte des lignes trouvées, qui se fait sans tenir compte du GROUP BY mais en tenant compte du WHERE (qui est fait sur le resultat du calcul précédant)
    Ha oki, donc c pour eviter tout probleme de prise en compte du GROUP BY alors qu il aurait pas du, que tu encapsule dans un From a travers une sous-requete ?

    non, je t'avais conseillé de les séparé un peu plus haut, ça diminue le nombre de calcul
    Vi pardon, je suis reparti d'un exemple anterieur a cette modif pour creer ma requete vla pourquoi.


    Enfin, j ai une derniere query dont je ne suis pas sur. Elle a pour but de donner les moyennes sur chaque module de Jean Dupont. (Je m interroge sur la succession de AND and un ON d'INNER JOIN)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT SAM.ModuleID, SUM(SAM.Score * A.Weight) AS Average
      FROM tblStudentAssessmentModule AS SAM INNER JOIN tblAssessment AS A
                                          ON SAM.AssessmentID = A.AssessmentID
                                       INNER JOIN tblStudent AS S
                                          ON SAM.StudentID = S.StudentID AND S.Surname=’Dupont’ AND S.Firstname=’Jean’
     
      GROUP BY SAM.StudentID, SAM.ModuleID
      ORDER BY ModuleID
    Merci pour tout Swoög, t es tres bon pedagogue en tout cas.

    Bonne nuit vais au dodo

  19. #19
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    alors, là c'est bon, il faut justement faire la distinction entre ce qui fait partie des conditions de jointures (condition sous lesquels les enregistrements des deux tables peuvent être liés), et les conditions de filtrage sur la requête...

    ce n'est pas tellement le AND qui pose problème, c'est plutôt que la condition sur le nom font partie du filtrage des données, et n'interviennent pas dans la liaison des deux tables

    De plus, du fait que tu filtre pour un seul étudiant, tu n'as plus besoin de group by sur le StudentID (puisqu'il n'y en a qu'un, pas besoin de grouper ^^)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT SAM.ModuleID, SUM(SAM.Score * A.Weight) AS Average
      FROM tblStudentAssessmentModule AS SAM
                                       INNER JOIN tblAssessment AS A
                                          ON SAM.AssessmentID = A.AssessmentID
                                       INNER JOIN tblStudent AS S
                                          ON SAM.StudentID = S.StudentID
     
      WHERE S.Surname=’Dupont’ AND S.Firstname=’Jean’
      GROUP BY SAM.ModuleID
      ORDER BY ModuleID
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  20. #20
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Coucou, c'est encore l'apprenti SQLeur ^^

    Arf, je vais pas en pondre une seule de correcte c la misere.

    Effectivement je comprends pourquoi il ne faut pas grouper par etudient

    Par contre, je ne comprends pas pourquoi le code ci dessous n'est pas bon (Cest a dire en mettant la condition sur nom et prenom dans le join)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT SAM.ModuleID, SUM(SAM.Score * A.Weight) AS Average
      FROM tblStudentAssessmentModule AS SAM
                                       INNER JOIN tblAssessment AS A
                                          ON SAM.AssessmentID = A.AssessmentID
                                       INNER JOIN tblStudent AS S
                                          ON SAM.StudentID = S.StudentID AND S.Surname=’Dupont’ AND S.Firstname=’Jean’
      GROUP BY SAM.ModuleID
      ORDER BY ModuleID
    Desolé suis long a la detente

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Calcul moyenne des notes en perl
    Par Contreras dans le forum Langage
    Réponses: 1
    Dernier message: 22/11/2011, 14h00
  2. Réponses: 4
    Dernier message: 14/12/2009, 20h31
  3. [MODULE] erreur sur le module DBI perl postgres
    Par neco2006 dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 27/11/2009, 16h23
  4. [1.x] Creer un filtre sur un module CRUD sur Symfony 1.1
    Par katie.gillot dans le forum Symfony
    Réponses: 1
    Dernier message: 28/10/2008, 17h00
  5. Réponses: 1
    Dernier message: 28/03/2007, 19h20

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