Question

J'ai une table et je voudrais tirer une ligne par id avec les valeurs de champ concaténer.

Dans ma table, par exemple, j'ai ceci:

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

Et je voudrais sortie:

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

En MySQL j'ai pu utiliser la fonction d'agrégation GROUP_CONCAT, mais cela ne semble pas fonctionner ici ... Y at-il un équivalent pour PostgreSQL, ou d'une autre façon d'y parvenir?

Était-ce utile?

La solution

Ceci est probablement un bon point de départ (version 8.4+ uniquement):

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

array_agg retourne un tableau, mais vous pouvez CAST que texte et modifier au besoin (voir précisions ci-dessous).

Avant la version 8.4, vous devez définir vous-même avant d'utiliser:

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

(paraphrase de la documentation PostgreSQL)

Clarifications:

  • Le résultat de la coulée d'un tableau de texte est que le début de la chaîne résultante et se termine par des accolades. Ces accolades doivent être enlevés par une méthode, si elles ne sont pas désirées.
  • Castings anyarray à TEXT simule mieux sortie CSV comme des éléments contenant des virgules sont intégrés à double cité dans la sortie dans le style standard CSV. Ni array_to_string () ou string_agg () (la fonction « group_concat » ajoutée 9.1) des chaînes de guillemets par des virgules intégrées, entraînant un nombre incorrect d'éléments dans la liste de résultats.
  • La nouvelle fonction 9.1 string_agg () ne rejette pas les résultats internes au premier texte. Donc, « string_agg (value_field) » générerait une erreur si value_field est un entier. "String_agg (value_field :: texte)" serait nécessaire. La méthode de array_agg () nécessite uniquement une fonte après l'agrégation (plutôt que d'un moulage par valeur).

Autres conseils

Depuis 9.0 ceci est encore plus facile:

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

fera aussi bien.

Essayez comme ceci:

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

et la version pour travailler sur le type de tableau :

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

Ma suggestion 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   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top