그룹후 가로를 세로로 나타내기..도움좀 부탁드리겠습니다. 0 7 1,250

by 감자마늘 [SQL Query] [2015.04.10 09:55:58]


데이터

 항목번호  항목명  이름      별명

     1            a     홍길동   홍홍 

     2            b     이순신   대장군

     1            a     김태희   여신

     2            b     수지      이민호

     1            a      김성령  아줌마

     2            b       강남    강남

 

예를 들어 위 데이터를 아래와 같이 표현하고싶습니다.

1         a          홍길동 홍홍 김태희 여신 김성령 아줌마

2         b         이순신 대장군 수지 이민호 강남 강남

수정)위 이름,별명, 이름, 별명은 각각 하나의 컬럼으로 나와야 해요..

 

여러가지 시도를 하다가.

 ROW_NUMBER() OVER (PARTITION BY  .. ORDER BY ..)를 사용했는데

다른 방법이 혹시 있을까요???

 

도움좀 부타그리겠습니다..

by DarkBee [2015.04.10 10:00:32]
순서에 상관없다면

select 항목번호, 항목명, wm_concat ( 이름 || ' ' || 별명 )
group by 항목번호, 항목명

 


by 감자마늘 [2015.04.10 10:02:24]

감사합니다^^ 혹시 순서에 상관이 있다면 어떻게 해야하나요?

아 그리고 위 쿼리 확인 했는데 저거는 

한 컬럼에 나오는거고 제가 원한거는 각각 컬럼이 필요해요 ㅜㅜ

제가 질문을 정확히 안올렸네요 수정하겠습니다.


by DarkBee [2015.04.10 10:29:26]

컬럼이 고정적이라면 가능하겠지만 가변적이라면 동적SQL 로 하셔야 됩니다.


by 아발란체 [2015.04.10 10:51:37]

PIVOT 함수를 이용한 X-Y 변경 강좌 : http://www.gurubee.net/lecture/2214


by 개발뉴비 [2015.04.10 11:01:09]
WITH T (항목번호, 항목명, 이름, 별명) AS (
    SELECT 1 , 'A' , '홍길동' , '홍홍'    FROM DUAL UNION ALL
    SELECT 2 , 'B' , '이순신' , '대장군'  FROM DUAL UNION ALL
    SELECT 1 , 'A' , '김태희' , '여신'    FROM DUAL UNION ALL
    SELECT 2 , 'B' , '수지'   , '이민호'  FROM DUAL UNION ALL
    SELECT 1 , 'A' , '김성령' , '아줌마'  FROM DUAL UNION ALL
    SELECT 2 , 'B' , '강남'   , '강남'    FROM DUAL
)
SELECT 항목번호
     , 항목명
     , MAX(이름_1) NAME01
     , MAX(별명_1) NICK01
     , MAX(이름_2) NAME02
     , MAX(별명_2) NICK02
     , MAX(이름_3) NAME03
     , MAX(별명_3) NICK03
FROM 
(SELECT * FROM (
        SELECT ROW_NUMBER() OVER(PARTITION BY 항목번호 ORDER BY 항목번호) NUM1
             , ROW_NUMBER() OVER(PARTITION BY 항목번호 ORDER BY 항목번호) + 1000 NUM2
             , 항목번호
             , 항목명
             , 이름
             , 별명 
        FROM T
    )
PIVOT(MAX(이름) FOR NUM1 IN (1 이름_1, 2 이름_2, 3 이름_3) ) 
PIVOT(MAX(별명) FOR NUM2 IN (1001 별명_1, 1002 별명_2, 1003 별명_3) ) ) AA
GROUP BY 항목번호, 항목명
;

by 마농 [2015.04.10 11:27:23]
WITH t AS
(
-- 순서(seq) 항목을 추가했습니다.
SELECT 1 cd, 'a' nm, 1 seq, '홍길동' nm1, '홍홍' nm2 FROM dual
UNION ALL SELECT 2, 'b', 1, '이순신', '대장군' FROM dual
UNION ALL SELECT 1, 'a', 2, '김태희', '여신'   FROM dual
UNION ALL SELECT 2, 'b', 2, '수지'  , '이민호' FROM dual
UNION ALL SELECT 1, 'a', 3, '김성령', '아줌마' FROM dual
UNION ALL SELECT 2, 'b', 3, '강남'  , '강남'   FROM dual
)
SELECT cd, nm
     , MIN(DECODE(rn, 1, nm1)) nm1_1
     , MIN(DECODE(rn, 1, nm2)) nm2_1
     , MIN(DECODE(rn, 2, nm1)) nm1_2
     , MIN(DECODE(rn, 2, nm2)) nm2_2
     , MIN(DECODE(rn, 3, nm1)) nm1_3
     , MIN(DECODE(rn, 3, nm2)) nm2_3
  FROM (SELECT cd, nm, nm1, nm2
             , ROW_NUMBER() OVER(PARTITION BY cd ORDER BY seq) rn
          FROM t
        )
 GROUP BY cd, nm
 ORDER BY cd
;

 


by 김치찌게 [2015.04.10 16:50:59]
-- oracle 11gR2(?) ~
select 항목번호, 항목명, listagg(이름 || ' ' || 별명, ' ') within group (order by rownum  )  col1
from T
group by 항목번호, 항목명
order by 항목번호, 항목명
/

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입