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

PostgreSQL Discussion :

[GROUP BY] column must appear in the GROUP BY clause


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 71
    Points
    71
    Par défaut [GROUP BY] column must appear in the GROUP BY clause
    Bonjour à tous,

    J'ai un probleme avec une requete SQL que j'execute su un POstGre 8.1.

    J'ai une liste contenant le libellé d'un diplome et la date d'obtention (jj/mm/aaaa).

    Je dois compter par année et par mois le nombre de diplome obtenu, classé par diplome, par année, et par mois.

    J'ai donc fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT( diplome.libelle ) , extract(YEAR FROM diplome.date) , extract(MONTH FROM diplome.date)
    FROM t_diplome diplome
    GROUP BY diplome.libelle, extract(YEAR FROM diplome.date), extract(MONTH FROM diplome.date)
    Et PostGreSql me sort :
    ERROR: column "diplome.date" must appear in the GROUP BY clause or be used in an aggregate function
    Je peux pas mettre la date dans mon group by, sinon, il va me compter les diplomes obtenus par jour et non plus par année puis mois ....

    Quelqu'un a une idée ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    Si j'ai bien compris, tu veux avoir le nombre de diplomes pour chaque mois?

    Si oui essaye ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT( * ) , date_trunc('month', diplome.date) as mois_diplome
    FROM t_diplome diplome
    GROUP BY mois_diplome
    date_trunc va faire une valeur approchée par défault à la valeur que tu lui passe en parametre, ici, le mois. Donc, si tu passe le 30/01/2006 12:45;65, il te revoie 01/01/2006 00:00

    par rapport à ta requete, le probleme est que lorsque tu utilise des fonctions (d'extraction ou autres), il vaut mieux mettre des alias. Ca t'évitera des déconvenues comme celles ci.
    Et puis, si je me trompe pas, tu faisais un group by su une autre valeur que celle que ton select avait extrait (une "copie") => pas de from dans un group by.

    ++
    Two beer or not two beer. (Shakesbeer)
    Question technique par MP => poubelle!

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Même soucis
    Je cherche à grouper mes moyennes par mois..
    J'ai essayé (sous postgresql):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select avg(price) as avg_price, date_trunc('month', '2011-06-25') as month
    from curves
    group by month
    --> ERREUR: la fonction date_trunc(unknown, unknown) n'est pas unique

    ou bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select avg(price) as avg_price, EXTRACT(MONTH FROM TIMESTAMP '2011-06-25') as month
    from curves
    group by month
    Mais ça me renvoie 1 moyenne celle de la table, alors que moi je veux LES moyennes PAR mois..


    Merci pour votre aide précieuse

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    C'est logique, je pense que vous ne comprenez pas le groupage !

    Un groupage est relatif à un calcul d'agrégat.
    Donc tout ce qui est dans la CLAUSE select, en dehors du calcul d’agrégat (max, min, sum, count...) doit figurer dans le GROUP BY ce qui n'est pas le cas de votre requête.... En effet, MONTH n'est pas une colonne de votre table, ni une expression.
    De plus grouper par mois sans l'année est généralement stupide... Vous aurez un calcul d'agrégat portant sur les ,mois de janvier de TOUTES les années !
    Est-ce bien ce que vous voulez ?

    Commencez par apprendre SQL. C'est un VRAI langage... Mon site web, comme mes ouvrages peuvent vous y aider !
    http://sqlpro.developpez.com/

    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/ * * * * *

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Exact, voici ce que je souhaité faire :
    (date est le nom d'une colonne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select avg(clse) as avg_price, extract(month from date) as month
                       from xxx 
                       group by month
                       order by month;

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut faire group by extract(month from date) au lieu de group by month.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/09/2014, 14h35
  2. [MySQL] affichage de tableau groupé par column
    Par casawia dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/07/2014, 09h40
  3. [H2] GROUP BY erreur must be in the group by
    Par peofofo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/05/2014, 10h33
  4. Réponses: 4
    Dernier message: 05/05/2013, 20h22
  5. Réponses: 4
    Dernier message: 05/09/2005, 11h13

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