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

SQL Firebird Discussion :

Problème de requête avec un group by


Sujet :

SQL Firebird

  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut Problème de requête avec un group by
    Bonsoir a tous

    Voici ma requête qui me cause tant de soucis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t_notes.mat_elev, max(t_notes.nom_eleve),((N_CC1+N_CC2)/2 )* 0.4+(N_EXAM*0.6)
    from t_notes
    where t_notes.numprojet=18 and  t_notes.mat_elev='8419'
    group by t_notes.mat_elev
    je me suis basé sur http://firebird.developpez.com/faq/?...usieurs-tables

    Mais j'ai message d'erreur :
    Invalid token.
    Dynamic SQL Error.
    SQL error code = -104.
    Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
    je comprend qu'il s'agit d'un problème au niveau du group by (via la partie calcul de ma requête) mais je ne sais pas comment m'en sortir
    J'ai besoin d'un coup de main.

    Merci a tous

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    bonjour,
    je comprend qu'il s'agit d'un problème au niveau du group by (via la partie calcul de ma requête)
    oui , car ton 3° champ n'est pas un champ groupé

    le mieux serait vraiment que tu nous donne la structure de la (des) table(s) et ce que tu veux obtenir

    Voici une correction selon ton SQL de départ , mais qui ne vaut certainement rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT mat_elev,((N_CC1+N_CC2)/2 )* 0.4+(N_EXAM*0.6), max(nom_eleve)
    FROM t_notes
    WHERE numprojet=18 AND  mat_elev='8419'
    GROUP BY 1,2
    il doit certainement manquer des choses ! il me semble évident que le nom de l'élève n'est pas dans un table notes , il manque donc au moins un join voire d'avantage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT t.mat_elev,e.nom_eleve, MAX((N_CC1+N_CC2)/2 )* 0.4+(N_EXAM*0.6))
    FROM t_notes T JOIN t_eleves E on t.mat_elev=e.mat_elev 
    WHERE t.numprojet=18
    GROUP BY 1,2
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    Ok voici la structure de mes tables :

    Eleves (mat_elev,nom_eleve,....)
    Notes(idnotes, idmatiere, mat_elev,nom_eleve,n_cc1,n_cc2,n_exam,..)

    Donc je voudrais la liste des élèves avec pour chaque ligne la moyenne générale:
    Moyenne par matière :
    MM=(N_CC1+N_CC2)/2 )* 0.4+(N_EXAM*0.6)
    Moyenne générale :
    MM divisé par le nombre de matière (es possible de récupérer le nombre de matière dans la même requête )
    Merci pour votre attention

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bon,

    a part une petite erreur de redondance (pourquoi remettre le nom de l'élève dans la table Notes ?) et en admettant que toutes les matières soient de même coefficient
    et que tous les élèves aient le même nombre de matières (pour un classement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT mat_elev,nom_eleve, AVG((N_CC1+N_CC2)/2 )* 0.4+(N_EXAM*0.6)) AS MOYENNE , COUNT(*) as NB_MATIERES
    FROM t_notes   
    WHERE numprojet=18
    GROUP BY 1,2
    order by 3 desc
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    je viens de tester tout marche correctement
    je vais modifier la table note pour tenir compte de la remarque.

    Mais j'avoue que je ne comprend pas certaines parties:

    1-
    GROUP BY 1,2
    ORDER BY 3 DESC
    Que traduit c'est deux lignes ?

    2- Es possible d'y inclure le rang pour un classement croissant (1er, 2eme,...)?

    3- La fonction AVG permet ici d'avoir la moyenne (total des notes / par le nombre de note) ok.
    Maintenant si je me trouve dans une situation ou les notes sont pondérées (chaque matière a sont coefficients),
    j'aurai moyenne=somme de toutes les notes * par leur coefficient respectif / par le total des coefficients
    comme faire dans ce cas ?

    Merci beaucoup

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par devalender Voir le message
    je vais modifier la table note pour tenir compte de la remarque.
    attention dans ce cas là , il faudra rajouter un join (comme indiqué dans ma première réponse)
    1- Que traduisent ces deux lignes ? 2- Est-il possible d'y inclure le rang pour un classement croissant (1er, 2eme,...)?
    GROUP BY 1, 2 : cela semble évident , c'est les champs que l'on va grouper ,les champs numéros 1 et 2 de la requête soit mat_eleve et nom_eleve
    ORDER BY 3 DESC : tri en ordre croissant sur la moyenne (ce que tu demandes dans le 2)

    3- La fonction AVG permet ici d'avoir la moyenne (total des notes / par le nombre de note) ok.
    Maintenant si je me trouve dans une situation ou les notes sont pondérées (chaque matière a sont coefficients),
    j'aurai moyenne=somme de toutes les notes * par leur coefficient respectif / par le total des coefficients
    comme faire dans ce cas ?
    dans ce cas là , cela sera différent , c'est pour cela que j'avais indiqué
    Citation Envoyé par sergiomaster
    en admettant que toutes les matières soient de même coefficient
    et que tous les élèves aient le même nombre de matières (pour un classement)
    j'avoue ne pas avoir chercher la solution , la seule idée que j'ai pour l'instant serait d'utiliser une CTE
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    Merci pour l'éclairage sur les deux dernières lignes du sql.
    j'ai aussi compris pour le JOIN avec la table Eleves en cas de modification sur la table notes.
    je ne connais pas trop bien les CTE mais je vais tenter de modifier ta première proposition pour voir si je peux aboutir à une solution concernant le point 3.
    Merci

Discussions similaires

  1. [HQL] Problème de requête avec un GROUP BY
    Par k o D dans le forum Hibernate
    Réponses: 4
    Dernier message: 13/09/2011, 08h48
  2. problème de requête avec utilisation de min/group by
    Par htristra dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 02/10/2007, 13h16
  3. Réponses: 3
    Dernier message: 11/10/2004, 17h26
  4. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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