une requete assez compliquée - SQL/NoSQL - Programmation
Marsh Posté le 23-07-2004 à 11:33:19
t'as réussi à faire quoi jusqu'à maintenant (requète)
Marsh Posté le 23-07-2004 à 11:39:08
bas rien!! déja le jour de l'exam j'ai pas fait cette question et aujourd'hui bien que j'ai le cours sous les yeux
j'arrive meme pas a commencer
vraiment je bloque
Marsh Posté le 23-07-2004 à 11:42:34
commence par lister les notes de chaque étudiant pour le module statistique. ensuite reviens ici avec la requète
Marsh Posté le 23-07-2004 à 11:43:02
Peut etre ca :
Sum(note*coefficient) group by etudiant en faisant les jointures qui vont bien sur module, etudiant, inscrit, epreuve et eval.
Marsh Posté le 23-07-2004 à 11:43:23
Piste : utilisation de SUM
Calcul : somme (Note*Coeff)/somme (coeff)
Marsh Posté le 23-07-2004 à 12:02:45
R1= SELECT codeepreuve,coef FROM EPREUVE WHERE noMODULE=(SELECT noModule FROM Module WHERE libelle="stat" )
R2= SELECT note FROM Eval, R1 WHERE Eval.codeEpreuve=R1.codeepreuve
Marsh Posté le 23-07-2004 à 14:03:03
houhou les gars c'est tellement moche ce que j'ai écrit que vous voulez p
Marsh Posté le 23-07-2004 à 14:07:03
C'est de l'agébrique ou du sql que tu fais?
Et je suppose que le but de ta question est de répondre en une seule requete.
Essaie en suivant les pistes qu'on t'a donné
Marsh Posté le 23-07-2004 à 14:13:54
plutot du sql (pardon j'ai pas précisé)
mais tu vois le truc c'est que d'une part on est sensé donner 2 types de requetes l'une avec des imbrications l'autre pas
et, de mon coté je galere. Faut dire que celle-la me bloque particulierement
Enfin j'essaye et e repasse dans l'apres midi
Marsh Posté le 23-07-2004 à 14:22:36
Select nomEtud, AVG(note)
From Eval ev, Epreuve ep, Etudiant et, Module mo
Where ev.noEtud=et.noEtud
and ev.codeEpreuve=ep.codeEpreuve
and ep.noModule=mo.noModule
and mo.libelle="statistique"
ca doit etre ca je pense non?
Marsh Posté le 23-07-2004 à 16:56:15
mectonium a écrit : Select nomEtud, AVG(note) |
moyenne non pondérée ici...
une requête sans garantie aucune
select Etu.noEtud, SUM(Eva.note*Epr.coefficient)/SUM(Epr.coefficient) |
mais ca doit être un truc dans le genre.
Dans le where on selectionne l'ensemble des notes des étudiants pour le module "statistique".
On découpe étudiant par étudiant dans le group by.
Et dans le select on affiche le nom de l'étudiant suivi de sa moyenne pondérée...
Marsh Posté le 23-07-2004 à 19:30:33
Bon, déjà, on commence avec des données, sans chercher à faire de requête...
Mettons un étudiant qui a 3 notes, avec chacune un coefficient différent.
|
Quelle est la moyenne pondérée ?
((9.5 * 5) + (15.0 * 3) + (12.5 * 8)) / (5 + 3 + 8)
Donc la moyenne pondérée est bien
SUM(note * coef) / SUM(coef)
Ensuite, pas besoin d'aller chercher bien loin...
Tu commences par lier les différentes tables nécessaires pour récupérer toutes les note et leurs coefficients de tous les étudiants, pour toutes les matières.
T'ajoutes juste un critère sur la matière pour ne garder que "statistique". Vu que tu utilises des jointures "simples" (inner join) les étudiants qui ne suivent pas ce court sont directement jartés.
T'as donc plus qu'à ne conserver comme champs "nomEtud", "note" et "coef", puis appliquer la formule trouvée en début d'exercice.
En soit, elle n'a rien de compliqué cette requête.
Vu que pains-aux-raisins à l'air d'avoir fait ton exercice, t'as qu'à répondre à cette question (du même gabarit, à peine plus complexe)
Afficher les moyennes obtenues par les étudiants de chaque professeur, par matière et par filière.
Je veux un résultat avec pour entête :
|
Puis une seconde :
Afficher les moyennes générales des étudiants ainsi que le nombre d'inscrits répartis par année de naissance pour chaque cycle.
Marsh Posté le 26-07-2004 à 09:19:29
ok les gars c'est sympa de m'avoir aidé, je vais essayer l'exo d'ARJUNA et je repasse
Marsh Posté le 27-07-2004 à 09:54:43
Alors Arjuna peux tu m'expliquer si je suis sur la bonne voie ou pas
Tout dabord je dois joindre les tables enseignant intervient module etudiant inscrit epreuve eval
ensuite ben ensuite.........
Marsh Posté le 27-07-2004 à 10:56:28
Oui c'est ça. Il faut aussi la filère pour retourner le nom de cette dernière.
Pour la suite, dans le résultat attendu, il y a un champ d'agrégation (la moyenne). Il faut donc un group by sur tous les autres champs. Ensuite, tu n'as qu'à faire comme dans le premier exercice.
Marsh Posté le 28-07-2004 à 10:13:13
si je comprends bien il faut
select Etud.nom prof.nom filiere.nom module.nom SUM(Eva.note*Epr.coefficient)/SUM(Epr.coefficient)
from intervient module etudiant inscrit epreuve eval filiere
where
"c'est là que je sais pas quoi mettre"
group by etudiant.noetud
Marsh Posté le 28-07-2004 à 10:28:44
Quelques conseils :
- N'oublie pas les virgules entre les attributs dans le SELECT (et le FROM aussi)
- Fais des jointures entre les tables que tu utilises de toute facon sinon c'est le produit cartésien alors...
- Sur le forum, met le code dans des blocs de code, c'est tout de suite beaucoup plus lisible
Marsh Posté le 28-07-2004 à 14:29:38
Comme hop le fou.
En insistant bien sur le second point.
Avant de te demander ce qui doit intervenir dans ton WHERE, suis-simplement les flèches de ton MPD, et traduit-les en jointures :
Table1.FK = Table2.PK
Une fois que tu as ça, ce qui est totalement "automatique", tu as 80% de la requête qui est terminée.
Sinon, conseil : au lieu de te demander quels champs retournés à partir de quelles tables, pour être sur de ne rien oublier, fait comme moi.
Tu pars d'une table (Professeur par exemple) puis petit à petit, afin de retrouvers les infos qui entrent en jeu dans le select et les éventuels filtres, tu rajoutes des tables à ta table. A chaque modification, si tu as la base sous la main, teste que ça retourne bien ce qu'il faut.
C'est le seul moyen que je connaisse pour écrire des requêtes complexes. Essayer de tout planifier à l'avance, c'est le meilleur moyen d'oublier un critère de jointure et passer deux jours à trouver ce qui merde dans une requête de 25 lignes.
Faut pas croire que j'écris ce genre de requêtes d'un jet
|
Marsh Posté le 28-07-2004 à 22:29:41
Simples simples, certes, m'enfin certaines règles sont loin d'être évidentes
Marsh Posté le 29-07-2004 à 14:37:19
Arjuna t'es trop fort!!
Alors voila je vous propose une autre requete sur le meme schema
Quels sont les nnumero de modules ou tous les enseignants interviennent?
j'ai essayé
SELECT noModule FROM Enseignant, Intervient
WHERE
COUNT (Enseignant.Noenseign)= COUNT (Intervient.noEnseign)GROUP BY noModule
je suis pas sur parce que jai jamais vu un COUNT dans le WHERE
Marsh Posté le 29-07-2004 à 14:42:13
Tu peux faire comme ça par exemple :
Code :
|
sinon on peut aussi le faire avec des EXISTS ou des jointures externe je pense ...
Marsh Posté le 29-07-2004 à 14:47:24
ouais en fait ça serai bien si je pouvais avoir les 2 versoins (select imbriqués et jointures)
Au fait beegee c'est faux ce que j'ai fait?
Marsh Posté le 29-07-2004 à 14:48:46
atic a écrit : ouais en fait ça serai bien si je pouvais avoir les 2 versoins (select imbriqués et jointures) |
bon t'as finir de faire faire tes TP ou quoi ?
Marsh Posté le 29-07-2004 à 14:51:20
Mais non je demande un coup de main ni plus ni moins
je suis en train de refaire un exam que j'ai foiré en vu de mon rattrapage en septembre
Apres si meme ça c'est interdit.....
Marsh Posté le 29-07-2004 à 14:52:42
mais non mais non
Marsh Posté le 29-07-2004 à 15:36:53
hey BeeGee
ça te dit kelke chose cette requete?
SELECT Nomodule FROM Intervient, Module, Enseignant
WHERE Intervient.noModule=Module.noModule
AND Intervient.noEnseign=Enseignant.noEnseign
AND Intervient.noEnseign=Module.noEnseign
GROUP BY noModule
Marsh Posté le 29-07-2004 à 15:44:30
La dernière ligne me semble plutôt :
AND Enseignant.noEnseign=Module.noEnseign
Marsh Posté le 29-07-2004 à 15:55:10
Ah oui en fesant cela on s'assure que TOUS les enseignants SANS exception interviennent dans ce module
et au niveau du GROUP BY c'est bien ça?
Marsh Posté le 29-07-2004 à 16:40:24
Non, tu va juste retrouver la liste des enseignants qui enseignent pour chaque module.
Tu ne t'assures pas encore de savoir si ils y sont sous.
Marsh Posté le 30-07-2004 à 09:27:24
Attends Arjuna ya un truc qui m'échappe
en faisant la requete avec ta derniere ligne j'ai l'impression qu'on verifie bien que tous les enseignants interviennent bien dans le module choisit
En effet on choisit un num de module et grace a la table intervient on prend tous les num d'enseignant et grace a ta derniere ligne Ben il faut forcement que tous les numero d"enseignat present dans la table enseignant se retrouvent dans la table module en etant associé au num de module choisit
Je crois que la requete est complete avec la ligne d'arjuna
qu'en pensez vous?
Marsh Posté le 30-07-2004 à 10:28:12
Non, tu sélectionnes juste tous les numéros de modules !
Imaginons que les seuls modules actuellement en base sont ceux pour lesquels 2 enseignants toto et tata (toujours les mêmes) ont participé (et aucun autre, et pourtant ils sont 6 au total). Ta requête renverra tous ces modules ... et pourtant aucun de ces modules n'a été enseigné par tous les enseignants.
En fait, si toutes les tables qui dépendent les unes des autres sont bien remplies, ta requêtes est équivalente à :
SELECT Nomodule FROM Module;
Marsh Posté le 30-07-2004 à 10:37:41
C'est dommage mais j'ai rien pour tester
Regarde dans ma requete
_je choisit un num de module
_ensuite je m'assure que tous les num enseignant de ma table enseignant se retrouvent bien dans ma table intervient tout en étant associé au num de module choisi
Je vois vraiment pas l'erreur!!
mais je dis pas qui y'en a pas
Marsh Posté le 30-07-2004 à 15:46:33
Ta requête ne fait pas ça :
"_ensuite je m'assure que tous les num enseignant de ma table enseignant se retrouvent bien dans ma table intervient tout en étant associé au num de module choisi"
Elle ne fait que récupérer la liste des enseignants qui interviennent sur ce module. En aucun cas on vérifie qu'ils y sont tous.
Marsh Posté le 30-07-2004 à 16:02:13
je vois Ben là franchement c'est chaud avec les jointures autant avec les requetes imbriquées je capte que là c'est le beug dans ma tete
Marsh Posté le 30-07-2004 à 16:50:17
vi, y'a deux câbles qui se touchent dans ta tête
repart sur des requêtes plus simples afin de mieu comprendre le fonctionnement de toutes ces requêtes.
commence simplement : récupère le nom du plus jeune étudiant de la table des élèves.
refait ensuite la requête en retournant l'élève le plus jeune pour chaque cycle.
Marsh Posté le 30-07-2004 à 16:54:15
c'est super des gens comme vous
vous vous faîtes "chier" à comprendre les problèmes des autres, et à aider les gens gratuitement !
c'est vraiment bien de votre part
quand j'aurais du temps, un jour... j'aiderai les gens... (si j'en ai les connaissances bien sûr)
Arjuna a écrit : Bon, déjà, on commence avec des données, sans chercher à faire de requête...
|
Marsh Posté le 30-07-2004 à 17:11:26
C'est surtout que je m'emmerde grave pendant de mes requêtes me rappatrient leurs 25 millions de lignes
Marsh Posté le 23-07-2004 à 11:27:37
je suis en train d'essayer de refaire un exam de BD en vu de mon rattrapage
Et je bute sur une requete assez compliquée
Calculer la moyenne pondérée du module "statistiqe" pour chaque étudiant concerné (de 2 façons avec et sans requetes imbriquées)
voici le schéma
FILIERE (noFil, nomFil, noEnseign)
CYCLE (codeCycle, nomCycle)
ENSEIGNANT (noEnseign, nomEnseign, statut)
MODULE (noModule, libellé, noEnseign)
INTERVIENT (noEnseign, noModule)
ETUDIANT (noEtud, nomEtud, prenom, adresse)
INSCRIT (noEtud, noModule, codeCycle, noFil)
EPREUVE (codeEpreuve, type, date, coefficient, noModule)
EVAL (noEtud, codeEpreuve, note)
mon probleme se pose au niveau du calcul de la moyenne pondérée
AVG ne peut faire ça
alors si vou avez une piste.....