Ich habe eine Tabelle und ich möchte pro Zeile eine Zeile mit verketteten Feldwerten ziehen.
In meiner Tabelle habe ich zum Beispiel Folgendes:
TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
Und ich würde gerne ausgeben:
TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
In MySQL konnte ich die Aggregatfunktion GROUP_CONCAT
verwenden, aber das scheint hier nicht zu funktionieren.
Dies ist wahrscheinlich ein guter Ausgangspunkt (nur Version 8.4+):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg gibt ein Array zurück, aber Sie können es CAST, um einen Text zu erstellen und nach Bedarf zu bearbeiten (siehe Erläuterungen unten).
Vor Version 8.4 müssen Sie sie vor der Verwendung selbst definieren:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(Umschreibung aus der PostgreSQL-Dokumentation)
Klarstellungen:
Seit 9.0 das ist noch einfacher:
SELECT id,
string_agg(some_column, ',')
FROM the_table
GROUP BY id
SELECT array_to_string(array(SELECT a FROM b),', ');
Werde es auch tun.
Versuchen Sie es so:
select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
und die Version für den Array-Typ :
select
array_to_string(
array(select distinct unnest(Zip_codes) from table),
', '
);
Mein Vorschlag in postgresql
SELECT cpf || ';' || nome || ';' || telefone
FROM (
SELECT cpf
,nome
,STRING_AGG(CONCAT_WS( ';' , DDD_1, TELEFONE_1),';') AS telefone
FROM (
SELECT DISTINCT *
FROM temp_bd
ORDER BY cpf DESC ) AS y
GROUP BY 1,2 ) AS x