복붙노트

[SQL] 한 행에 여러 행을 집계 오라클 SQL 쿼리가 있습니까? [복제]

SQL

한 행에 여러 행을 집계 오라클 SQL 쿼리가 있습니까? [복제]

나는 모습이 좋아하는 테이블이 있습니다 :

A 1 
A 2 
B 1 
B 2

그리고 나는 모습이 좋아하는 결과 세트를 생성하려면 :

A 1 2 
B 1 2

이 작업을 수행 할 것이라는 SQL 문이 있습니까? 나는 오라클을 사용하고 있습니다.

관련 질문 :

해결법

  1. ==============================

    1.그것은 당신이 사용하고있는 오라클의 버전에 따라 달라집니다. 그것은 wm_concat () 함수를 지원하는 경우, 당신은 단순히 같은 것을 할 수 있습니다 :

    그것은 당신이 사용하고있는 오라클의 버전에 따라 달라집니다. 그것은 wm_concat () 함수를 지원하는 경우, 당신은 단순히 같은 것을 할 수 있습니다 :

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

    wm_concat ()는 기본적으로 MySQL의에서 () 단지 GROUP_CONCAT처럼 작동합니다. 그것은 문서화되지 않을 수 있으므로 SQLPLUS 올드 너희를 해고하고 거기 인 경우에 참조하십시오.

    그것은이없는 경우에, 당신은 뭔가에게 동등한 자신을 구현하려는 것입니다. 당신은 oracle-base.com에서 문자열 집계 페이지에서이 작업을 수행하는 방법에 대한 몇 가지 지침을 찾을 수 있습니다.

  2. ==============================

    2.오라클은 그 동안 개선 꽤 오래된 주제,하지만 다른 사람을 도울 수 있습니다.

    오라클은 그 동안 개선 꽤 오래된 주제,하지만 다른 사람을 도울 수 있습니다.

    LISTAGG 기능을 사용하면 (11g 적어도) 찾고있는 것입니다

  3. ==============================

    3.오라클 10g +에서 :

    오라클 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
    

    설명에 대한 내 블로그에서이 문서를 참조하십시오 :

  4. ==============================

    4.같은 것을보십시오 :

    같은 것을보십시오 :

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

    자유롭게이 오라클 포럼에서 발견 대답에 의해 영감을 된.

    편집 :이 솔루션은 105 행 같은 것을 포함하는 요청에 집중적 매우 자원을 증명했다. 존에 의해 제안 나는 사용자 정의 집계 함수에 의해이 교체 끝났다.

  5. ==============================

    5.당신이 10g 가지고 있다면, 당신은 아래의 기능을 통해 이동해야합니다 :

    당신이 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
    

    여기 바이올린

    당신은 오라클 11g를 가지고 있다면, 당신은 listagg을 사용할 수 있습니다 :

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

    Listagg 여기 바이올린

  6. ==============================

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

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

    그냥 / 붙여 넣기를 사용하여 복사합니다. 9i의에서 작동합니다.

  7. ==============================

    7.

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

    사용자 정의 컬렉션에 주조 할 수있다 - PL / SQL은 매우 유용하게 사용하는 경우.

  8. from https://stackoverflow.com/questions/1120706/is-there-an-oracle-sql-query-that-aggregates-multiple-rows-into-one-row by cc-by-sa and MIT license