Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2006, 12h05   #1
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 162
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 162
Points : 39
Points : 39
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 :
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 :
Citation:
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
michaelbob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2006, 17h16   #2
Membre chevronné
 
Avatar de Spoutnik
 
Homme
Inscription : octobre 2003
Messages : 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Etats-Unis

Informations forums :
Inscription : octobre 2003
Messages : 668
Points : 746
Points : 746
Si j'ai bien compris, tu veux avoir le nombre de diplomes pour chaque mois?

Si oui essaye ca :
Code :
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!
Spoutnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 18h54   #3
Invité de passage
 
maxime gerbe
Inscription : mars 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : maxime gerbe

Informations forums :
Inscription : mars 2011
Messages : 3
Points : 3
Points : 3
Par défaut Même soucis

Je cherche à grouper mes moyennes par mois..
J'ai essayé (sous postgresql):

Code :
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 :
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
mgerbe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 14h19   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 17h56   #5
Invité de passage
 
maxime gerbe
Inscription : mars 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : maxime gerbe

Informations forums :
Inscription : mars 2011
Messages : 3
Points : 3
Points : 3
Exact, voici ce que je souhaité faire :
(date est le nom d'une colonne)
Code :
1
2
3
4
SELECT avg(clse) AS avg_price, extract(month FROM date) AS month
                   FROM xxx 
                   GROUP BY month
                   ORDER BY month;
mgerbe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 18h40   #6
Modérateur
 
Inscription : octobre 2008
Messages : 1 509
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 509
Points : 2 041
Points : 2 041
Il faut faire group by extract(month from date) au lieu de group by month.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h46.


 
 
 
 
Partenaires

Hébergement Web