[sql] PostgreSQL GROUP_CONCAT에 해당합니까?

테이블이 있고 필드 값이 연결된 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를 TEXT로 캐스팅하면 포함 된 쉼표가 포함 된 요소가 출력에서 ​​표준 CSV 스타일로 이중 인용되므로 CSV 출력을 가장 잘 시뮬레이션합니다. array_to_string () 또는 string_agg () (9.1에 추가 된 “group_concat”함수)는 쉼표가 포함 된 문자열을 인용하지 않으므로 결과 목록에 요소 수가 잘못됩니다.
  • 새로운 9.1 string_agg () 함수는 먼저 내부 결과를 TEXT로 캐스트하지 않습니다. 따라서 value_field가 정수이면 “string_agg (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에서 나의 sugestion

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   


답변

오라클 쿼리가 작동하기를 바랍니다.

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