Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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
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
Pages : 1