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

Access Discussion :

problème dans une requête de calcul de rang


Sujet :

Access

  1. #1
    Modérateur
    Avatar de bertiny
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 282
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    1
    Par défaut problème dans une requête de calcul de rang
    Bonjour
    J'ai un Problème sur le calcul du rang dans ma base de données.
    En fait j'ai une base de données qui stocke les notes des élèves. Dans mon cas, chaque année scolaire est divisée en Séquences d'enseignement (6 au total). Deux séquences constituent un Trimestre. Vous comprenez donc que pour obtenir la note d'un trimestre il faut faire la somme des notes de deux séquences divisés par deux.
    D'après cette petite description, vous convenez que je ne pouvais pas créer une table Trimestre parce qu'elle contiendra juste un champ calculé.

    -J'ai donc créer une requête Trimestre (requête analyse croisée dynamique ) qui me produit les notes trimestrielles.
    -J'ai créé une autre requête MoyenneTrimestre basée sur la requête Trimestre qui me calcule les moyennes des élèves.
    -J'ai enfin créé une requête RangTrimestre basée sur la requête MoyenneTrimestre pour déterminer le rang qu'occupe chaque élève à la fin d'un Trimestre. Le problème se situe donc à ce niveau.
    J'ai une erreur "le moteur de base de données Microsoft Access ne reconnait pas << >> en tant que nom de champ ou expression correcte."

    J'ai déjà eu à faire un poste sur ce sujet en exposant la requête mais je ne trouve pas toujours de solution.

    Je voudrais savoir si c'est cet enchaînement de requêtes qui fait problème?

    Merci
    Le monde évolue et nous avec. La technologie change les idées de ceux qui s'intéressent et pensent qu'il est nécessaire de changer.
    Oh là!! Que c'est bien de trouver la solution à un problème

    Pensons à améliorer nos connaissances en toute humilité car on apprend tous tous les jours !!!

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonjour,

    peut-on voir le code sql des 3 requetes ?

    merci

  3. #3
    Modérateur
    Avatar de bertiny
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 282
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    1
    Par défaut
    je vais d'abord signalé que j'ai oublié une requête et vous le constaterais.

    1-Requête Trimestre (Analyse croisée dynamique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PARAMETERS [Formulaires]![choix classe trimestre]![classe1] Short;
    TRANSFORM First(Compose.note_compose) AS PremierDenote_compose
    SELECT Eleve.id_eleve, [nom_eleve] & " " & [prenom_eleve] AS NomPrenom, Eleve.nom_eleve, Eleve.prenom_eleve, Matiere.nom_matiere, Classe.nom_classe, Enseignant.nom_enseignant, Matiere.coef_matiere, Matiere.Groupe, Enseignant.nom_enseignant
    FROM Sequence INNER JOIN (Matiere INNER JOIN (Enseignant INNER JOIN (((Classe INNER JOIN Eleve ON Classe.id_classe = Eleve.id_classe_fk) INNER JOIN Intervenir ON Classe.id_classe = Intervenir.classe) INNER JOIN Compose ON Eleve.id_eleve = Compose.id_eleve_fk) ON Enseignant.id_enseignant = Intervenir.enseignant) ON (Matiere.id_matiere = Enseignant.id_matière_fk) AND (Matiere.id_matiere = Compose.id_matiere_fk)) ON Sequence.id_sequence = Compose.id_sequence_fk
    WHERE (((Sequence.valeur)=1 Or (Sequence.valeur)=2) AND ((Classe.id_classe)=[Formulaires]![choix classe trimestre]![classe1]))
    GROUP BY Eleve.id_eleve, [nom_eleve] & " " & [prenom_eleve], Eleve.nom_eleve, Eleve.prenom_eleve, Matiere.nom_matiere, Classe.nom_classe, Enseignant.nom_enseignant, Classe.id_classe, Enseignant.nom_enseignant, Matiere.coef_matiere, Matiere.Groupe, Classe.id_classe
    PIVOT Sequence.valeur;
    2- requête qui permet d'avoir les notes extraites de la requête analyse croisée dynamique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Trimestre.id_eleve, Trimestre.NomPrenom, Trimestre.nom_matiere, Trimestre.nom_classe, Trimestre.[1], Trimestre.[2], IIf(IsNull([1] Or [2]),[2],IIf(IsNull([2]),[1],([1]+[2])/2)) AS NoteTrim, Trimestre.coef_matiere, [NoteTrim]*[coef_matiere] AS notecoef
    FROM Trimestre
    3- Requête qui renvoie la moyenne de chaque élève

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MoyTrim1.id_eleve, MoyTrim1.NomPrenom, Sum([MoyTrim1]![NoteTrim]*[MoyTrim1]![coef_matiere])/Sum([MoyTrim1]![coef_matiere]) AS Moy1
    FROM MoyTrim1
    GROUP BY MoyTrim1.id_eleve, MoyTrim1.NomPrenom;

    4- requête qui calcule le rang de chaque élève

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T1.Moy1, (select count(Moy1) from MoyRangTrim1 T2 where T2.Moy1>T1.Moy1)+1 AS Rang
    FROM MoyRangTrim1 AS T1
    GROUP BY T1.Moy1
    ORDER BY T1.Moy1 DESC;
    Le monde évolue et nous avec. La technologie change les idées de ceux qui s'intéressent et pensent qu'il est nécessaire de changer.
    Oh là!! Que c'est bien de trouver la solution à un problème

    Pensons à améliorer nos connaissances en toute humilité car on apprend tous tous les jours !!!

  4. #4
    Invité
    Invité(e)
    Par défaut
    bonjour,

    concernant la dernière requête, j'aurais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id_eleve, Moy1, (SELECT COUNT(Moy1) FROM MoyRangTrim1 WHERE Moy1>T1.Moy1 )+1 AS Rang
    FROM MoyRangTrim1 AS T1
    ORDER BY Moy1 DESC;

  5. #5
    Modérateur
    Avatar de bertiny
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 282
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    1
    Par défaut
    Çà ne marche toujours pas
    Le monde évolue et nous avec. La technologie change les idées de ceux qui s'intéressent et pensent qu'il est nécessaire de changer.
    Oh là!! Que c'est bien de trouver la solution à un problème

    Pensons à améliorer nos connaissances en toute humilité car on apprend tous tous les jours !!!

  6. #6
    Invité
    Invité(e)
    Par défaut
    Compte-tenu de la complexité de votre système actuel , je penche pour un problème de propagation de type de données
    De plus, certaines parties des requêtes sont étonnantes comme IsNull([1] Or [2])

    Le plus simple pour éviter de tatonner à l'aveugle et pour gagner du temps, c'est d'avoir un extrait de vos tables et vos requetes dans une base

    Je suis persuader qu'on peut obtenir le résultat attendu en évitant de passer par l'enchainement de 4 requetes...

  7. #7
    Modérateur
    Avatar de bertiny
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 282
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    1
    Par défaut
    sans faute. c'est un problème qui me tient vraiment à coeur. Je t'envoie la BD.
    EEE.rar
    Le monde évolue et nous avec. La technologie change les idées de ceux qui s'intéressent et pensent qu'il est nécessaire de changer.
    Oh là!! Que c'est bien de trouver la solution à un problème

    Pensons à améliorer nos connaissances en toute humilité car on apprend tous tous les jours !!!

  8. #8
    Invité
    Invité(e)
    Par défaut
    En passant par une fonction de domaine ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT T1.id_eleve, T1.Moy1, dcount("moy1","MoyRangTrim1","Moy1>" & str(t1.moy1))+1 AS Rang
    FROM MoyRangTrim1 AS T1
    GROUP BY T1.id_eleve, T1.Moy1
    ORDER BY T1.Moy1 DESC;
    Remarque : la moyenne de l'élève 16 n'est pas correcte, c'est à cause de cette formule qui me paraissait douteuse (voir post précédent)

  9. #9
    Modérateur
    Avatar de bertiny
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 282
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    1
    Par défaut
    L'erreur constatée au niveau de IsNull([1] Or [2]) est bien réelle. Je l'ai corrigé.
    J'ai essayé aussi cette fonction de domaine plusieurs fois mais çà ne marche pas. En réalité je ne sais pas ce qui bloque.
    Essaies aussi voir.

    Pour la formule IsNull([1] Or [2]) il faut juste corriger en IsNull([1]), [2]
    Je pense que ce que je t'ai essayé porte la même erreur.
    Le monde évolue et nous avec. La technologie change les idées de ceux qui s'intéressent et pensent qu'il est nécessaire de changer.
    Oh là!! Que c'est bien de trouver la solution à un problème

    Pensons à améliorer nos connaissances en toute humilité car on apprend tous tous les jours !!!

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ca fonctionne très bien sur votre extrait de base, j'ai testé ainsi:

    1) ouvrir le formulaire et choisir classe 6ème A
    2) laisser le formulaire ouvert et lancer la requête de mon post précédent
    3) Contempler le résultat

    Si ca ne fonctionne pas :
    1) l'erreur est-elle différente ou c'est la même que précédemment ?
    2) Les valeurs décimales (type moyenne) s'affichent dans Access avec un point ou une virgule ?

  11. #11
    Modérateur
    Avatar de bertiny
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 282
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par galoir Voir le message
    Ca fonctionne très bien sur votre extrait de base, j'ai testé ainsi:

    1) ouvrir le formulaire et choisir classe 6ème A
    2) laisser le formulaire ouvert et lancer la requête de mon post précédent
    3) Contempler le résultat

    Si ca ne fonctionne pas :
    1) l'erreur est-elle différente ou c'est la même que précédemment ?
    2) Les valeurs décimales (type moyenne) s'affichent dans Access avec un point ou une virgule ?
    J'obtient toujours le même message d'erreur que j'ai signalé au début.
    Les valeurs décimales s'affichent avec une virgule.
    Le monde évolue et nous avec. La technologie change les idées de ceux qui s'intéressent et pensent qu'il est nécessaire de changer.
    Oh là!! Que c'est bien de trouver la solution à un problème

    Pensons à améliorer nos connaissances en toute humilité car on apprend tous tous les jours !!!

  12. #12
    Invité
    Invité(e)
    Par défaut
    Voici un deuxième solution

    Créer les 3 requetes suivantes
    La 1ère sera nommée : "rEleveMoyMatiereTrim1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PARAMETERS [Formulaires]![choix classe trimestre]![classe1] Long;
    SELECT Eleve.id_eleve, [nom_eleve] & " " & [prenom_eleve] AS NomPrenom, Matiere.id_matiere, Avg(Compose.note_compose) AS MoyMatiere, Matiere.coef_matiere
    FROM Sequence INNER JOIN (Matiere INNER JOIN ((Classe INNER JOIN Eleve ON Classe.id_classe = Eleve.id_classe_fk) INNER JOIN Compose ON Eleve.id_eleve = Compose.id_eleve_fk) ON Matiere.id_matiere = Compose.id_matiere_fk) ON Sequence.id_sequence = Compose.id_sequence_fk
    WHERE (((Classe.id_classe)=[Formulaires]![choix classe trimestre]![classe1]) AND ((Sequence.valeur)=1 Or (Sequence.valeur)=2))
    GROUP BY Eleve.id_eleve, [nom_eleve] & " " & [prenom_eleve], Matiere.id_matiere, Matiere.coef_matiere;
    la 2ème nommée "rEleveMoyTrim1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id_eleve, NomPrenom, Sum([MoyMatiere]*[coef_matiere])/Sum([coef_matiere]) AS Moy1
    FROM rEleveMoyMatiereTrim1
    GROUP BY id_eleve, NomPrenom;
    Enfin la 3ème qui calcule le rang des élèves ("rEleveTrim1Rang")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT r1.id_eleve, r1.NomPrenom, r1.Moy1, (SELECT COUNT(Moy1) FROM rEleveMoyTrim1 WHERE Moy1>r1.Moy1)+1 AS Rang
    FROM rEleveMoyTrim1 AS r1
    ORDER BY r1.Moy1 DESC;
    Lancer directement la 3ème requete et taper 1 lorsqu'elle demande le choix de la classe

  13. #13
    Modérateur
    Avatar de bertiny
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 282
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    1
    Par défaut
    Çà marche. Merci pour le coup de main
    Le monde évolue et nous avec. La technologie change les idées de ceux qui s'intéressent et pensent qu'il est nécessaire de changer.
    Oh là!! Que c'est bien de trouver la solution à un problème

    Pensons à améliorer nos connaissances en toute humilité car on apprend tous tous les jours !!!

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

Discussions similaires

  1. Problème dans une requête
    Par clettebou dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/10/2006, 19h03
  2. [Factoring_Clause]Problème dans une requête
    Par media dans le forum Oracle
    Réponses: 4
    Dernier message: 30/08/2006, 13h47
  3. [Access] Problème dans une requête SQL avec INNER JOIN ?
    Par bds2006 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/06/2006, 10h57
  4. Problème dans une requête SQL avec AS et ON ?
    Par bds2006 dans le forum Bases de données
    Réponses: 9
    Dernier message: 26/06/2006, 15h25
  5. problème dans une requête
    Par pierrOPSG dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/11/2005, 10h28

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