我有一个表,我想要拉一个行每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,或另一种方式来做到这一点?

有帮助吗?

解决方案

这可能是一个良好的起点(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文件)

澄清:

  • 结果,铸造一个阵列来文的是,所得到的串的开始和结束与大括号内。这些括号需要删除一些方法,如果他们不是期望的。
  • 铸造ANYARRAY到文本的最好的模拟CSV输出作为要素包含嵌入逗号是双引号中的产出在标准CSV的风格。不array_to_string()或string_agg()(the"group_concat"功能加在9.1)报价串与嵌入逗号,导致数目不正确的元素产生的清单。
  • 新9.1string_agg()function不铸内的结果文本的第一个。因此,"string_agg(value_field)"就会产生一种错误,如果value_field是一个整数。"string_agg(value_field::text)"将是必需的。该array_agg()方法只需要一投之后的聚合(而不是投每值)。

其他提示

由于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   
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top