Pregunta

Tengo una tabla y me gustaría tirar una fila por cada id con valores de campo concatenados.

En mi mesa, por ejemplo, tengo esto:

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

Y me gustaría a salida:

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

En MySQL que fue capaz de utilizar la función de agregado GROUP_CONCAT, pero que no parece que el trabajo aquí ... ¿Hay un equivalente para PostgreSQL, o de otra manera de lograr esto?

¿Fue útil?

Solución

Esto es probablemente un buen punto de partida (versión 8.4+ solamente):

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

ARRAY_AGG devuelve una matriz, pero se puede emitir ese de texto y editar según sea necesario (ver aclaraciones, más adelante).

Antes de la versión 8.4, usted tiene que definir por sí mismo antes de su uso:

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

(parafraseado de la documentación de PostgreSQL)

Aclaraciones:

  • El resultado de la fundición una matriz para texto es que la cadena resultante comienza y termina con llaves. Esos apoyos deben ser eliminados por algún método, si no se desean.
  • casting ANYARRAY que mejor simula la salida de texto CSV como elementos que contengan incrustados comas están entre comillas dobles en la salida en el estilo estándar CSV. Ni array_to_string () o string_agg () (la función "GROUP_CONCAT" añadido en 9.1) cadenas cita con comas incrustadas, resultando en un número incorrecto de elementos en la lista resultante.
  • La nueva función string_agg 9.1 () no arrojó los resultados internos al texto primero. Así "string_agg (value_field)" generaría un error si value_field es un entero. "String_agg (value_field :: texto)" sería necesaria. El método ARRAY_AGG () requiere solamente un molde después de la agregación (en lugar de un molde por valor).

Otros consejos

Desde 9,0 esto es aún más fácil:

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

Lo haremos así.

Trate de esta manera:

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

y la versión para trabajar en el tipo array :

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

Mi sugerencia en 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   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top