복붙노트

[SQL] 오라클에 연결하여 그룹의 여러 행 [중복]

SQL

오라클에 연결하여 그룹의 여러 행 [중복]

나는이 같은 테이블이 있다고 가정하자 :

NAME          GROUP_NAME
name1         groupA
name2         groupB
name5         groupC
name4         groupA
name3         groupC

이 같은 결과를 가지고 싶습니다

GROUP_NAME     NAMES
groupA         name1,name4
groupB         name2
groupC         name3,name5

테이블에 하나의 컬럼이 있다면, 나는 다음을 수행하여 기록을 연결할 수 있지만, 상황에 그룹화와, 정말 많은 생각을하지 않습니다.

하나의 컬럼 테이블을 Concatatenating :

SELECT names 
FROM (SELECT SYS_CONNECT_BY_PATH(names,' ') names, level
      FROM name_table

      START WITH names = (SELECT names FROM name_table WHERE rownum = 1)
      CONNECT BY PRIOR names < names
      ORDER BY level DESC)
      WHERE rownum = 1 

지금 LISTAGG를 사용하여 해결책을 가지고 있습니다 :

SELECT
group_name,
LISTAGG(name, ', ')
WITHIN GROUP (ORDER BY GROUP) "names"
FROM name_table
GROUP BY group_name

LISTAGG를 사용할 수없는 경우 또 경우에보다 "일반적인"솔루션에 관심.

해결법

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

    1.당신이 11g에있어 경우에 LISTAGG 기능을 사용하는 것이 좋습니다 :

    당신이 11g에있어 경우에 LISTAGG 기능을 사용하는 것이 좋습니다 :

    select grp, listagg(name,',') within group( order by name ) 
      from name_table group by grp
    

    sqlFiddle

    UPD : 혹시, 웹 로그 분석을 사용하는 것을 고려하지 않을 :

    select grp,
        ltrim(max(sys_connect_by_path
           (name, ',' )), ',')
            scbp
      from (select name, grp,
                row_number() over
               (partition by grp
                order by name) rn
             from tab
              )
    start with rn = 1
    connect by prior rn = rn-1
    and prior grp = grp
      group by grp
      order by grp
    

    sqlFiddle

  2. from https://stackoverflow.com/questions/12558509/concatenate-and-group-multiple-rows-in-oracle by cc-by-sa and MIT license