programing

여러 행을 한 행에 집약하는 Oracle SQL 쿼리가 있습니까?

codeshow 2023. 3. 13. 20:42
반응형

여러 행을 한 행에 집약하는 Oracle SQL 쿼리가 있습니까?

다음과 같은 테이블이 있습니다.

A 1 
A 2 
B 1 
B 2

그리고 다음과 같은 결과 세트를 만들고 싶습니다.

A 1 2 
B 1 2

이를 수행할 SQL 문이 있습니까?Oracle을 사용하고 있습니다.

관련 질문:

(경고 -WM_CONCAT는 버전 12c에서 삭제된 지원되지 않는 기능입니다.오래된 데이터베이스를 사용하지 않는 한 이 기능은 사용하지 마십시오.사용하시는 것이 좋을 것 같습니다.LISTAGG대신).


사용 중인 Oracle 버전에 따라 다릅니다.wm_concat() 함수를 지원하는 경우 다음과 같은 작업을 수행할 수 있습니다.

SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;

wm_concat()는 기본적으로 MySQL의 group_concat()과 동일하게 동작합니다.문서화되어 있지 않을 수 있으므로 오래된 sqlplus를 기동하여 있는지 확인합니다.

존재하지 않는 경우는, 스스로 동등한 것을 실장할 필요가 있습니다.이 방법에 대한 몇 가지 절차는 oracle-base.com의 문자열 집약 페이지에서 확인할 수 있습니다.

꽤 오래된 토픽이지만 Oracle이 개선되었기 때문에 다른 사람에게 도움이 될 수 있습니다.

LISTAGG 기능은 당신이 원하는 것입니다(11g 이상).

Oracle 10g+:

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        MODEL
        PARTITION BY
                (grouper)
        DIMENSION BY
                (ROW_NUMBER() OVER (PARTITION BY grouper ORDER BY id) AS rn)
        MEASURES
                (val, val AS group_concat, 0 AS mark)
        RULES SEQUENTIAL ORDER (
                group_concat[rn > 1] ORDER BY rn = group_concat[CV() - 1] || ', ' || val[CV()],
                mark[ANY] ORDER BY rn = PRESENTV(mark[CV() + 1], 0, 1)
                )
        )
WHERE   mark = 1
ORDER BY
        grouper

자세한 내용은 블로그에서 다음 기사를 참조하십시오.

다음과 같은 방법을 시도해 보십시오.

SELECT
    field1,
    RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s
  FROM yourTable
  GROUP BY field1

Oracle 포럼에서 찾은 답변에서 자유롭게 영감을 얻습니다.

편집: 이 솔루션은 약 10개의5 행이 포함된 요청을 통해 매우 많은 리소스를 필요로 하는 것으로 입증되었습니다.John의 제안대로 커스텀 애그리게이트 기능으로 대체하게 되었습니다.

10g을 가지고 있는 경우는, 다음의 기능을 실행할 필요가 있습니다.

CREATE OR REPLACE FUNCTION get_separated_value (input_val  in  number)
  RETURN VARCHAR2
IS
  return_text  VARCHAR2(10000) := NULL;
BEGIN
  FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP
    return_text := return_text || ' ' || x.col2 ;
  END LOOP;
  RETURN return_text;
END;
/

다음과 같이 할 수 있습니다.

select col1, get_separated_value(col1) from table_name

여기를 만지작거리다

oracle 11g이 있는 경우 listagg를 사용할 수 있습니다.

SELECT 
    age,
    LISTAGG(name, ' ') WITHIN GROUP (ORDER BY name) "names"
FROM table_x
GROUP BY age

Listagg를 위해 여기를 만지작거리다

사용자 정의 집약 함수: http://www.adp-gmbh.ch/ora/sql/user_def_agg.html

복사/붙여넣기만 하면 됩니다.9i로 동작합니다.

SELECT a , COLLECT(b) FROM foo GROUP BY a

pl/sql에서 사용하는 경우 매우 유용합니다. 사용자 정의 컬렉션에 캐스팅할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1120706/is-there-an-oracle-sql-query-that-aggregates-multiple-rows-into-one-row

반응형