我有一个表,我想在每个id中拉一行,并将字段值连接起来。
在我的表中,例如,我有这个:
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,或其他方法来实现这一点?
答案 0 :(得分:229)
Since 9.0这更容易:
SELECT id,
string_agg(some_column, ',')
FROM the_table
GROUP BY id
答案 1 :(得分:206)
这可能是一个很好的起点(仅限8.4+版本):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg会返回一个数组,但您可以根据需要对其进行CAST编辑和编辑(请参阅下面的说明)。
在8.4版之前,您必须在使用之前自行定义:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(从PostgreSQL文档中解释)
澄清:
答案 2 :(得分:41)
SELECT array_to_string(array(SELECT a FROM b),', ');
也会这样做。
答案 3 :(得分:12)
试试这样:
select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
答案 4 :(得分:0)
我对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
答案 5 :(得分:0)
以及要在数组类型上使用的版本:
select
array_to_string(
array(select distinct unnest(zip_codes) from table),
', '
);
答案 6 :(得分:0)
希望下面的Oracle查询有效。
Select First_column,LISTAGG(second_column,',')
WITHIN GROUP (ORDER BY second_column) as Sec_column,
LISTAGG(third_column,',')
WITHIN GROUP (ORDER BY second_column) as thrd_column
FROM tablename
GROUP BY first_column