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 13: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