Exercice SQL 3

Signaler
Messages postés
2
Date d'inscription
mercredi 2 décembre 2020
Statut
Membre
Dernière intervention
9 février 2021
-
Messages postés
14273
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 février 2021
-
j'ai les tables suivantes :
            • Types*******************************

create type table_matiere as (id_Matiere int,Note float);
create type Sem as enum ('S1','S2');
            • Tables****************************

create table matiere (
id int primary KEY,
nom varchar(50),
coef int
);

create table etudiant (
mat varchar(6) primary key,
nom varchar(50),
prenom Varchar[3],
date_naiss date
);

create table notes(
note int primary key,
etud varchar(6),
semestre sem,
matiere table_matiere,
CONSTRAINT note_etud_fkey FOREIGN KEY(etud) REFERENCES etudiant(mat)
ON UPDATE CASCADE ON DELETE CASCADE
);

les questions :
1- S’assurer que les valeurs prises par (Matiere). Id_Matiere sont uniquement celles prises par id dans la table matiere ( cad on il ne faut pas ajouter une note d'une matiere qui n'existe pas dans la table matiere.
---> mon repense:
create trigger notes_trigger
on matiere
for insert , update
as
begin
if( select id from matiere x != inserted i )
begin
rollback;

2- Donner le code de la fonction GetMoyenne :
prendre en considération le cas où plusieurs notes relatives à la même matière peuvent être saisies.
---> CREATE FUNCTION Getmoyenne(m varchar(6)) RETURNS float AS
DECLARE
v float; v1 matiere.coef%TYPE ;
begin

SELECT into v1 sum(coef) from notes,matiere where etud=m and (matiere).id_Matiere = id;
SELECT into v sum(((matiere).Note*coef)/v1) FROM notes,matiere WHERE etud = m and id = (matiere).id_Matiere;

return v;
end;
' LANGUAGE plpgsql;
      • mais il ne fonctionne pas comme il faut

1 réponse

Messages postés
14273
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 février 2021
804
bonjour,
"ne fonctionne pas comme il faut": cela donne quoi, qu'attends-tu?
Messages postés
2
Date d'inscription
mercredi 2 décembre 2020
Statut
Membre
Dernière intervention
9 février 2021

si par exemple j'ai deux notes dans la même matière , il les calculer comme deux notes de différentes matières.
ex:
1er matière avec coeff 3 les notes sont 19 et 17 , il fait 19*3+17*3 au lieu de (19+17 )*3/2
Messages postés
14273
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 février 2021
804 >
Messages postés
2
Date d'inscription
mercredi 2 décembre 2020
Statut
Membre
Dernière intervention
9 février 2021

à ta place, si je voulais comprendre ce qui se passe, je ferais plutôt:
SELECT into v sum(((matiere).Note*coef)/v1), v1 FROM notes,matiere WHERE etud = m and id = (matiere).id_Matiere;

prends aussi un peu de temps pour nus montrer le résultat obtenu, ainsi que les données de départ.