Frage

Ich habe eine Tabelle, und ich möchte eine Zeile pro-ID mit Feldwerte verkettet ziehen.

In meinem Tisch, zum Beispiel, ich habe dies:

TM67 | 4  | 32556
TM67 | 9  | 98200
TM67 | 72 | 22300
TM99 | 2  | 23009
TM99 | 3  | 11200

Und ich ausgeben möchte:

TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3    | 23009,11200

In MySQL konnte ich die Aggregatfunktion GROUP_CONCAT verwenden, aber das scheint nicht zu Arbeit hier ... Gibt es ein Äquivalent für PostgreSQL, oder eine andere Art und Weise dies zu erreichen?

War es hilfreich?

Lösung

Dies ist wahrscheinlich ein guter Ausgangspunkt (Version 8.4+ only):

SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field

array_agg gibt einen Array, aber Sie können CAST, dass je nach Bedarf Text und bearbeiten (siehe Erläuterungen weiter unten).

Vor der Version 8.4, müssen Sie es selbst definieren vor der Verwendung:

CREATE AGGREGATE array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);

(von der PostgreSQL-Dokumentation paraphrasiert)

Klärungen:

  • Das Ergebnis eines Arrays Text Gießen ist, dass die resultierende Zeichenkette beginnt und endet mit geschweiften Klammern. Diese Klammern müssen durch ein Verfahren entfernt werden, wenn sie nicht erwünscht sind.
  • Casting ANYARRAY zu TEXT am besten simuliert CSV-Ausgabe als Elemente, die eingebetteten Kommas sind in doppelten Anführungszeichen in der Ausgabe im Standard-CSV-Stil. Weder array_to_string () oder string_agg () (die "Group_concat" -Funktion hinzugefügt in 9.1) Zitat Strings mit eingebetteten Kommas, was zu einer falschen Anzahl von Elementen in der Ergebnisliste.
  • Die neue 9.1 string_agg () Funktion warf nicht die inneren Ergebnisse TEXT zuerst. So „string_agg (value_field)“ würde einen Fehler erzeugen, wenn value_field eine ganze Zahl ist. "String_agg (value_field :: Text)" erforderlich wäre. Die array_agg () Methode erfordert nur eine Besetzung nach der Aggregation (anstelle einem Guss pro Wert).

Andere Tipps

Seit 9.0 dies ist noch einfacher:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id
SELECT array_to_string(array(SELECT a FROM b),', ');

Wird auch tun.

Versuchen Sie wie folgt aus:

select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;

und die Version an der Arbeit auf dem 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   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top