テーブルがあり、フィールド値が連結されたIDごとに1行を取得したいと思います。
たとえば、私のテーブルには次のようなものがあります。
TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
そして、私は出力したい:
TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
MySQLでは、集約関数GROUP_CONCAT
を使用できましたが、ここでは機能しないようです... PostgreSQLに相当するもの、またはこれを実現する別の方法はありますか?
これはおそらく良い出発点です(バージョン8.4以降のみ):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg は配列を返しますが、必要に応じてテキストにキャストして編集できます(以下の説明を参照)。
バージョン8.4より前は、使用する前に自分で定義する必要があります。
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(PostgreSQLドキュメントから言い換え)
明確化:
9.0以降 これはさらに簡単です:
SELECT id,
string_agg(some_column, ',')
FROM the_table
GROUP BY id
SELECT array_to_string(array(SELECT a FROM b),', ');
同様に行います。
このようにしてみてください:
select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
配列タイプで動作するバージョン:
select
array_to_string(
array(select distinct unnest(Zip_codes) from table),
', '
);
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