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

Firebird Discussion :

Cannot use an aggregate function in a GROUP BY clause


Sujet :

Firebird

  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 49
    Par défaut Cannot use an aggregate function in a GROUP BY clause
    Bonjour.
    Firebird 2.0 -

    Soit deux tables

    Citation Envoyé par TABLE1
    ID NOM
    01 MOI
    02 TOI,
    Citation Envoyé par TABLE2
    IND ID RANG MONTANT
    1 01 100 10
    2 01 100 5
    3 01 101 6
    4 02 100 7
    5 02 101 6
    6 02 101 6
    7 01 102 25
    Le champs de "RANG" varie de 100 à ..., mais je ne veux analyser que trois valeurs (100, 101 et 102).
    Je souhaite avoir une table résultat en additionnant les valeurs de MONTANT selon l'ID et le RANG, avec en résultat :

    ID NOM RANG100 RANG101 RANG102
    01 MOI 15 6 25
    02 TOI 7 12
    J'ai fait la reqête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select T1.ID, T1.NOM
    case when RANG = 100 then sum(MONTANT) else 0 end RANG100,
    case when RANG = 101 then sum(MONTANT) else 0 end RANG101,
    case when RANG = 102 then sum(MONTANT) else 0 end RANG102
    from TABLE1 T1 left outer join TABLE2 T2 on T1.ID=T2.ID
    group by T1.ID, T1.NOM, RANG100, RANG101, RANG102
    Je pense que vous avez pigé le but de la requête. Malheureusement, j'obtiens systématiquement "Cannot use an aggregate function in a GROUP BY clause".
    Je sèche sur la façon de résoudre ça correctement.
    Comment vous y prendriez-vous ?
    Merci
    Michel

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    je ne corrige pas la requête , seulement la clause Group by

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select T1.ID, T1.NOM
    case when RANG = 100 then sum(MONTANT) else 0 end RANG100,
    case when RANG = 101 then sum(MONTANT) else 0 end RANG101,
    case when RANG = 102 then sum(MONTANT) else 0 end RANG102
    from TABLE1 T1 left outer join TABLE2 T2 on T1.ID=T2.ID
    group by 1,2,3,4,5
    ps. merci bien bien vouloir utiliser les balises pour un lecture plus facile

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonjour,

    Questions de néophyte:
    1-Ne manque-t-il pas la virgule de séparation après le premier T1.NOM?
    2-Il me semble que le groupement ne se fait que sur les champs ID et NOM. Il faudrait donc enlever les 3 derniers champs du GROUP BY.

    André

  4. #4
    Membre très actif Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Par défaut
    Peut-être en écrivant la requête comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T1.ID, T1.NOM,
     sum(case when RANG = 100 then MONTANT else 0 end) RANG100,
     sum(case when RANG = 101 then MONTANT else 0 end) RANG101,
     sum(case when RANG = 102 then MONTANT else 0 end) RANG102
    FROM TABLE1 T1 LEFT OUTER JOIN TABLE2 T2 ON T1.ID=T2.ID
    GROUP BY T1.ID, T1.NOM

  5. #5
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 49
    Par défaut
    Super, ça marche.
    sum(case when RANG = 100 then MONTANT else 0 end) RANG100,
    Merci.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/01/2014, 18h25
  2. 'staticData' cannot be used as a function
    Par Go'Gaule dans le forum Débuter
    Réponses: 2
    Dernier message: 26/06/2011, 10h06
  3. error: `new' undeclared (first use in this function)
    Par moon93 dans le forum Réseau
    Réponses: 14
    Dernier message: 11/07/2006, 16h57
  4. Réponses: 4
    Dernier message: 23/06/2006, 19h03
  5. Pb de "aggregate function" dans un req. S
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/05/2004, 15h11

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