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 :

Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)


Sujet :

SQL Firebird

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
    Bonjour,

    J'ai besoin de faire des group by sur des sous requete du genre (base EMPLOYE.FDB) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(PROJ_ID), (select FIRST_NAME from EMPLOYEE where EMP_NO=TEAM_LEADER)
    from PROJECT
    group by 2
    Sauf que Firebird me retourne :
    expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
    J'ai pensé à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(PROJ_ID), (select  (select FIRST_NAME from EMPLOYEE where EMP_NO=TEAM_LEADER) from RDB$DATABASE)
    from PROJECT
    group by 2
    sans succès

    Bien sur la solution consiste à utiliser un left join. Sauf que dans mon cas c'est compliqué car ma sous requête peut être créé par mon utilisateur final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select count(PROJ_ID), FIRST_NAME
    from PROJECT
    left join  EMPLOYEE on EMP_NO=TEAM_LEADER
    group by 2
    J'utilise actuellement Firebird 3, mais j'utilise Firebird depuis très longtemps mais je n'ai jamais compris pourquoi Firebird refusait les group by sur des sous requête surtout que ça marche en SQLITE (je sais ce n'est pas une référence en SQL). J'ai espéré un mieux sur Firebird 2 puis 3 puis 4.
    Je pense comprendre que le problème viendrait du faire Firebird n'arrive pas à associer le count au champ du group by.
    Mais une idée sans passer par un left join ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    21 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 21 143
    Points : 50 169
    Points
    50 169
    Billets dans le blog
    1
    Par défaut
    Est-ce que ce serait pas plus simple comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select FIRST_NAME, count(PROJ_ID) 
    from  EMPLOYEE
          RIGHT OUTER JOIN PROJECT
             ON EMP_NO=TEAM_LEADER
    GROUP  BY FIRST_NAME
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour la réponse.
    Hélas ça ne me fait pas avancer car ma problématique est j'ai une requête générique auquel l'utilisateur peut ajouter une sous requête personnalisée. Je ne connais donc pas ce qu'elle contient et donc impossible à remplacer par une jointure.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    avril 2010
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 222
    Points : 471
    Points
    471
    Par défaut
    Bonjour,

    Si je comprends bien, vous voulez connaître pour TOUS les employés, le nombre de projets dont chacun est responsable (on comprendrait mieux votre besoin s'il était exprimé en bon français plutôt que par une requête qui ne fonctionne pas...).
    Dans ce cas la requête suivante fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select e.EMP_NO,e.FIRST_NAME
    ,(select count(*) as PROJETS from PROJECT where TEAM_LEADER=e.EMP_NO)
    from EMPLOYEE e
    J'y ai inclus EMP_NO car FIRST_NAME peut ne pas être unique.

    André

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour André,


    Citation Envoyé par alanglet Voir le message
    Si je comprends bien, vous voulez connaître pour TOUS les employés, le nombre de projets dont chacun est responsable (on comprendrait mieux votre besoin s'il était exprimé en bon français plutôt que par une requête qui ne fonctionne pas...).
    Ma problématique est de faire un group by sur une sous requête dont je ne connais pas le contenu, car définit par l'utilisateur, en l’occurrence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select FIRST_NAME from EMPLOYEE where EMP_NO=TEAM_LEADER
    dans mon exemple. Donc je ne peux pas en transformer le contenu.
    Mais je pense avoir trouvé une solution, c'est de passer par une table dérivée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select count(PROJ_ID), FIRST_NAME 
    from  (
    select PROJ_ID, (select FIRST_NAME from EMPLOYEE where EMP_NO=TEAM_LEADER)
    from PROJECT
     )
    group by 2


    Merci.

Discussions similaires

  1. [MySQL] Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column
    Par Denis Placé dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/09/2017, 09h42
  2. Réponses: 3
    Dernier message: 26/09/2014, 11h33
  3. [GROUP BY] column must appear in the GROUP BY clause
    Par michaelbob dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 18/07/2011, 18h40
  4. Réponses: 6
    Dernier message: 17/03/2011, 23h27
  5. Réponses: 1
    Dernier message: 06/04/2008, 11h09

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