PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 20/10/2011 11:04:25

gilou974
Membre

Requete select avec sortie sous forme de colone

Bonjour à tous,

voilà je voudrais savoir si il est possible en sql (pour une vue qui me sert dans CrystalReport) d'avoir le resultat de plusiseurs lignes d'enregistrement mais en colone :

Je m'explique

supposons que j'ai

dans la table t1 deux enregistrements : id =1 et id=2

dans la table t2 j'ai 5 enregistrements

id =1; id_t1 = 1; nom='pim'; prenom='mip'
id =2; id_t1 = 1; nom='pam'; prenom='map'
id =3; id_t1 = 1; nom='poum'; prenom='muop'
id =4; id_t1 = 2; nom='tic'; prenom='cit'
id =5; id_t1 = 2; nom='cat'; prenom='tac'

est-il possible sans passer par une fonction d'obtenir donc :

id_t1 = 1; sortie1 = 'pim mip'; sortie2 = 'pam map'; sortie3 = 'poum moup'
id_t1 = 2; sortie1 = 'tic cit'; sortie2 = 'tac cat'; sortie3 = ''

merci par avance

gilou974

Hors ligne

#2 20/10/2011 11:24:59

Marc Cousin
Membre

Re : Requete select avec sortie sous forme de colone

Habituellement, on utilise une table pivot pour ça.

Sinon, avec PostgreSQL, il y a un module de contrib qui fournit de quoi le faire:

http://docs.postgresql.fr/9.0/tablefunc.html
(c'est la fonction crosstab qui vous intéresse)

Il y a une assez bonne démo de comment s'en servir sur la page de doc.


Marc.

Hors ligne

#3 20/10/2011 11:33:41

gilou974
Membre

Re : Requete select avec sortie sous forme de colone

Merci bcp Marc pour votre réponse,

je vais regarder ce module.

Quand vous parlez de table pivot vous entendez une table temporaire crée  à la volée, c'est çà ?

gilou974

Hors ligne

#4 20/10/2011 11:56:51

Marc Cousin
Membre

Re : Requete select avec sortie sous forme de colone

Oui, ou une table en dur, ça se fait aussi. C'est justement l'avantage d'utiliser tablefunc. On génère une table dynamiquement, de la bonne taille directement. Par contre, ce n'est évidemment pas portable vers d'autres bases.


Marc.

Hors ligne

#5 20/10/2011 12:27:29

gilou974
Membre

Re : Requete select avec sortie sous forme de colone

D'accord et merci encore.

Pour ce qui est des autres bases pas de soucis, par contre je n'arrive pas à installer le module tablefunc j'ai des erreure de conversions de types signalées quand je lance contrib/tablefunc/sql/tablefunc.sql
je regarde çà de plus près et peut être devrais je solliciter de l'aide de nouveau.

Merci encore, je ferai le retour dans l'après midi.

Bon ap' à tous en attendant

Hors ligne

#6 20/10/2011 19:43:59

gilou974
Membre

Re : Requete select avec sortie sous forme de colone

Juste pour ceux que çà intéresserait :

ma solution :


select * from crosstab(
'
select id1, position, pers from
(
    select r2.id1, r2.pers,count(r2.id1) as position
    from
    (
    select t1.id as id1, t2.id as id2,(t2.nom||'' ''||t2.prenom)::varchar(40) as pers from t1 join t2 on t1.id = t2.id_t1
    )r1,
    (
    select t1.id as id1, t2.id as id2,(t2.nom||'' ''||t2.prenom)::varchar(40) as pers from t1 join t2 on t1.id = t2.id_t1
    )r2
    where r1.id2 <= r2.id2 and r1.id1 = r2.id1
    group by r2.id1, r2.id2, r2.pers
    order by r2.id1, r2.id2
)out1 where position <=3 ' )
AS ct(row_name integer, category_1 varchar(40), category_2 varchar(40), category_3 varchar(40))


je ne sais pas s'il y a plus simple mais la ca tourne......


merci encore à Marc

Hors ligne

Pied de page des forums