Domanda

Ho una tabella e mi piacerebbe tirare una riga per id con i valori dei campi concatenati.

Nel mio tavolo, per esempio, ho questa:

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

E mi piacerebbe uscita:

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

In MySQL sono stato in grado di utilizzare la funzione di GROUP_CONCAT aggregata, ma che non sembra lavoro qui ... c'è un equivalente per PostgreSQL, o in un altro modo per ottenere questo?

È stato utile?

Soluzione

Questo è probabilmente un buon punto di partenza (versione 8.4+ only):

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

array_agg restituisce un array, ma si può lanciare quella di testo e modificare, se necessario (vedi chiarimenti, di seguito).

Prima della versione 8.4, è necessario definire da soli prima dell'uso:

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

(parafrasato dalla documentazione di PostgreSQL)

Chiarimenti:

  • Il risultato del casting un array di testo è che le risultanti stringa inizia e termina con parentesi graffe. Tali bretelle devono essere rimosse da un metodo, se non sono desiderati.
  • Casting anyarray al miglior testo simula uscita CSV come elementi che contengono incorporati virgole sono due citato in uscita in grande stile CSV standard. Né array_to_string () o string_agg () (la funzione "group_concat", ha aggiunto in 9.1) stringhe di citazione con virgole incorporate, con conseguente un numero errato di elementi nella lista risultante.
  • La nuova funzione 9.1 string_agg () non getta i risultati interni al testo prima. Quindi, "string_agg (value_field)" potrebbe generare un errore se value_field è un numero intero. "String_agg (value_field :: testo)" sarebbe necessario. Il metodo array_agg () richiede un solo getto dopo l'aggregazione (anziché un getto per valore).

Altri suggerimenti

Dal 9,0 questo è ancora più semplice:

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

Lo farò pure.

Prova in questo modo:

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

e la versione per il lavoro sul tipo di matrice :

select
  array_to_string(
    array(select distinct unnest(zip_codes) from table),
    ', '
);

Il mio suggerimento 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   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top