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.....