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 20/02/2006, 17h21   #1
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Par défaut Concaténation avec Group by

Bonjour,

Je me demandais s'il existait une fonction "agrégat" (style SUM, AVG) qui me permettrait de concaténer les résultats d'une requête utilisant un GROUP BY.

Par exemple : concaténer les noms de villes où ont habité chaque personne

Code :
1
2
3
4
 
SELECT nom, FONCTION(ville)
FROM personne
GROUP BY nom
Et ça retounerait des rows du style :

'MonsieurX' 'Paris, Bruxelles, Madrid'
'MonsieurY' 'New York'

Il me faudrait donc une fonction qui permette de mettre un séparateur entre chaque valeur. J'ai vu qu'on pouvait créer ses propres fonctions agrégat avec CREATE AGGREGATE, mais si je pouvais m'en passer, ça serait pas mal.

(Ma vraie requête n'est pas celle là, mais j'ai essayé de simplifier)

Merci d'avance
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 20h50   #2
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Salut,
tu peux essayer ca :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE OR REPLACE FUNCTION agg_virgule(text, text)
  RETURNS text AS
$BODY$
BEGIN
 IF $2 IS NULL THEN
  RETURN $1;
 END IF;
 IF LENGTH($1)>0 THEN
  IF position($2 IN $1)=0 THEN
   RETURN $1;
  ELSE
   RETURN $1||','||$2;
  END IF;
 ELSE
  RETURN $2;
 END IF;
END;$BODY$
  LANGUAGE 'plpgsql';
 
CREATE AGGREGATE aggvirgule(
  BASETYPE=text,
  SFUNC=agg_virgule,
  STYPE=text
);
tu es obligé de passer par un aggrégat quand il y a group by.
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2006, 00h07   #3
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Bonsoir,

Merci beaucoup pour cette fonction, c'est exactement ce que je voulais.

Il y avait une petite erreur, je pense pour un IF

Code :
1
2
  IF position($2 IN $1) <> 0 THEN
   RETURN $1;
Encore merci !
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h12.


 
 
 
 
Partenaires

Hébergement Web