Zeilen zur einer Spalte zusammenfügen

Hallo,

hab zwar schon Beispiele im Internet zu dem Thema gefunden, allerdings helfen dir mir nicht ganz weiter, da ich am Anfang nicht weiß wieviele Zeilen ich in einer Spalte zusammenfügen muss.
Mein Problem ist folgendes:
Ich hab eine Anzahl an Zeilen die ich in einer Spalte zusammenfügen möchte, Beispiel:
Tabelle

id | wert
1 abc
1 dbc
1 abc
2 xyz
2 zyx

Ausgabe

id | wert
1 abc dbc abc
2 xyz zyx

Danke und Gruß



test=*# select * from sauerkraut ;
 id | wert
----+------
  1 | abc
  1 | dbc
  1 | abc
  2 | xyz
  2 | zyx
(5 Zeilen)

test=# CREATE AGGREGATE array_accum (anyelement)
test-# (
test(#     sfunc = array_append,
test(#     stype = anyarray,
test(#     initcond = '{}'
test(# );
CREATE AGGREGATE

test=*# select id, array_to_string(array_accum(wert),',') from sauerkraut group by 1;
 id | array_to_string
----+-----------------
  1 | abc,dbc,abc
  2 | xyz,zyx
(2 Zeilen)

test=*# select id, array_to_string(array_accum(wert),' ') from sauerkraut group by 1;
 id | array_to_string
----+-----------------
  1 | abc dbc abc
  2 | xyz zyx
(2 Zeilen)

Andreas

Ach ja, falls Du 8.4 hast: ohne extra Aggregat, einfach so:

test=# select id, array_to_string(array_agg(wert),' ') from sauerkraut group by 1;
 id | array_to_string
----+-----------------
  1 | abc dbc abc
  2 | xyz zyx
(2 Zeilen)

Andreas

Er setzt bei mir ziemlich viele Leerzeichen zwischen den Einträgen, kann man das irgendwie minimieren?

Tja, man sollte es halt richtig machen. Ob Du das tust und ob Du evtl. was falsch machst, kann ich ohne daß Du zeigst, was Du machst, nicht sehen.

test=*# select * from b;
 id |  name
----+---------
  1 | pizza
  1 | hot dog
  2 | gorilla
  2 | monkey
  3 | apple
  4 | cheese
  4 | milk
  4 | eggs
(8 rows)

test=*# select id, array_to_string(array_agg(name),' ') from b group by id;
 id | array_to_string
----+------------------
  4 | cheese milk eggs
  1 | pizza hot dog
  3 | apple
  2 | gorilla monkey
(4 rows)

Andreas

Vielleicht hast Du in der Felddefinition char und nicht varchar, so daß die Leerzeichen mit verkettet werden?