Le forum (ô combien francophone) des utilisateurs de Powerbuilder.



Hello,
je voudrais asvoir s'il existe une fonction équivalente à sum, mais qui concatènerait une colonne de varchar.
Exemple :
j'ai la table
create table#tempo
(
nombre integer,
carac varchar(10)
)
avec les deux lignes suivantes :
10 'a'
20 'b'
si je fais select sum(nombre) from #tempo, ok j'obtiens la somme de la colonne : 30
Mais si je veux la concaténation totale du contenu de la colonne carac (c'est à dire 'ab'), comment faire ?
Merci.
Dernière modification par Deedoo2000 (26-10-2007 15:01:10)
Hors ligne








Tu peux peut être faire un curseur ?
Hors ligne



Mouais, ça risque d'être compliqué... En fait le but c'est de concaténer une colonne pour des lignes qui ont la même valeur dans une autre colonne :
C1 C2 C3
1 X a
2 X b
3 Y c
ça doit me donner
X ab
Y c
Hors ligne








si si avec un curseur ca va être facile
Hors ligne



Montre moi
Hors ligne








declare ton_curs cursor for Select C2,C3 from ta_table; open ton_curs; fetch ton_curs into :ls_c2, :ls_c3; do while SQLCA.sqlcode=100 if isnull(ls_c2) or ls_temp<>ls_c2 then ls_temp = ls_c2 elseif ls_temp = ls_c2 then ls_concat = ls_concat + ls_c2 end if fetch ton_curs into :ls_c2, :ls_c3; loop close ton_curs;
ça devrait donner quelque chose comme ça .. si j'aibien compris.
Hors ligne



Merci, mais en fait c'est pas exactement ça. Je me suis mal exprimé.
Je voudrais obtenir dans une autre table le résultat suivant :
C1 C2
X ab
Y c
Ca se corse là non ?
Hors ligne




Tu ordonnes ta requête de curseur et après, à chaque fois que tu changes de C1 (X, Y...), tu insères tes résultats (ls_concat) dans une datawindow qui correspond à ta table.
Hors ligne










et si tu as
C1 C2 C3
1 X a
2 X b
3 Y c
4 X d
5 Y b
tu dois avoir quoi ?
Hors ligne



JCZ a écrit:
et si tu as
C1 C2 C3
1 X a
2 X b
3 Y c
4 X d
5 Y b
tu dois avoir quoi ?
X abd
Y cb
Hors ligne










1 . curseur avec un select distinct C2
--> recu de ls_c2
2. pour chaque enreg curseur avec select distinct C3 from where C2 = :ls_c2 avec eventuellement un tri
-->recu de ls_c3_temp
ls_c3 = ls_c3_temp + ls_c3
3. --> insert into ou setItem ls_c2 & ls_c3
En esperant avoir compris ton probleme
Hors ligne



JCZ a écrit:
1 . curseur avec un select distinct C2
--> recu de ls_c2
2. pour chaque enreg curseur avec select distinct C3 from where C2 = :ls_c2 avec eventuellement un tri
-->recu de ls_c3_temp
ls_c3 = ls_c3_temp + ls_c3
3. --> insert into ou setItem ls_c2 & ls_c3
En esperant avoir compris ton probleme
Merci, ça semble en effet correspondre mais j'ai un peu de mal à mettre ça en application. Je comprends pas trop le "pour chaque enreg curseur avec".
Hors ligne










un truc comme
declare ton_curs1 cursor for Select distinct C2 from ta_table; declare ton_curs2 cursor for Select distinct C3 from ta_table where C2= :ls_c2; open ton_curs1; fetch ton_curs1 into :ls_c2; do while SQLCA.sqlcode=100 ls_c3 = '' ls_c3_tmp = '' open ton_curs2; fetch ton_curs2 into :ls_c3_tmp; do while SQLCA.sqlcode=100 ls_c3 = ls_c3 + ls_c3_tmp --> insert --> setItem fetch ton_curs2 into :ls_c3_tmp; loop close ton_curs2; fetch ton_curs1 into :ls_c2; loop close ton_curs1;
Hors ligne



Merci beaucoup, je vois le truc maintenant.
Hors ligne