SQL ) 데이터를 컬럼으로 변경할 수 있을까요? 0 6 2,109

by 쿼리back [SQL Query] [2013.06.05 15:05:07]


일딴 쿼리를 정말 못짜서 , 혼자 낑낑대다가 질문 올립니다 . OTL
(단 ,code 값은 고정이 아니라 바뀔수 있음...ㅠ)
a 테이블
id     |  code  | result
aaa  |    X     |  성공
aaa  |    Y     |  실패
bbb  |    X     |  성공
bbb  |    Y     |  실패
ccc  |    X     |  성공

b 테이블
id       |  name  
aaa    |  홍길동
bbb    |  성춘향 
ccc    |  고길동

a 와 b를 조인해서
id      | name   |  X    |  Y     |
----------------------------
aaa   |  홍길동 | 성공  | 실패 |
bbb   |  성춘향 | 성공  | 실패  |
ccc   |   고길동 | 성공 |         |

위와 같이 표현할 수 있을까요?? 
by 우리집아찌 [2013.06.05 15:23:12]
-- 다이나믹 쿼리로 짜셔야할듯합니다. 
WITH T1 (id, code, result) AS (
SELECT 'aaa' , 'X' , '성공' FROM DUAL UNION ALL
SELECT 'aaa' , 'Y' , '실패' FROM DUAL UNION ALL
SELECT 'bbb' , 'X' , '성공' FROM DUAL UNION ALL
SELECT 'bbb' , 'Y' , '실패' FROM DUAL UNION ALL
SELECT 'ccc' , 'X' , '성공' FROM DUAL 
) , T2 (id, name )AS (
SELECT 'aaa' , '홍길동' FROM DUAL UNION ALL
SELECT 'bbb' , '성춘향' FROM DUAL UNION ALL
SELECT 'ccc' , '고길동' FROM DUAL 
)


SELECT 
 T1.id 
 ,MAX(T2.name)
 -- .... 요기부턴 다이나믹 쿼리로
 ,MAX(DECODE(CODE,'X',result)) x
 ,MAX(DECODE(CODE,'Y',result)) Y
 -- ....
 -- ....
 -- ....

FROM T1 , T2
WHERE T1.ID = T2.ID
GROUP BY T1.ID 

by 디케이 [2013.06.05 15:31:29]
code가 고정이 아니면 SQL로 불가능하죠..

Dynamic SQL로 구현할 수 밖에 없을것 같네요

by 아린 [2013.06.05 16:06:17]
code 의 갯수가 제한적일 경우 사용하실수 있을것 같은데요.
t1 테이블의 code 가 위의 예시와 다를경우(중복이나 기타등등..) 는 Dynamci SQL을 참조하세요.

SELECT t1.id, MAX(t2.name) name
     , MAX(DECODE(tcode.seq, 1, t1.result)) c1
     , MAX(DECODE(tcode.seq, 2, t1.result)) c2
     , MAX(DECODE(tcode.seq, 3, t1.result)) c3
     , MAX(DECODE(tcode.seq, 4, t1.result)) c4
     , MAX(DECODE(tcode.seq, 5, t1.result)) c5
  FROM t1, t2
     , (SELECT ROWNUM seq, code
          FROM (SELECT DISTINCT code
                  FROM t1
                 ORDER BY code
                )
        ) tcode          
 WHERE t1.id = t2.id
   AND t1.code = tcode.code
 GROUP BY t1.id   
 ORDER BY t1.id

by 야신 [2013.06.05 16:55:09]
일단 코드만 몇개인지 확정됭 있다면 아래와 같이 이용할 수 있을 듯 합니다.
예제는 우리집아찌님 것을 사용하였습니다.

WITH T1 (Xid, code2, result) AS (
SELECT 'aaa' , 'X' , '성공' FROM DUAL UNION ALL
SELECT 'aaa' , 'Y' , '실패' FROM DUAL UNION ALL
SELECT 'bbb' , 'X' , '성공' FROM DUAL UNION ALL
SELECT 'bbb' , 'Y' , '실패' FROM DUAL UNION ALL
SELECT 'ccc' , 'X' , '성공' FROM DUAL 
) , T2 (Xid, nameT )AS (
SELECT 'aaa' , '홍길동' FROM DUAL UNION ALL
SELECT 'bbb' , '성춘향' FROM DUAL UNION ALL
SELECT 'ccc' , '고길동' FROM DUAL 
)
SELECT *
FROM ( SELECT T1.XID,nameT, CODE2, T1.result
        FROM T1 , T2
        WHERE T1.XID = T2.XID
       GROUP BY T1.XID,nameT, CODE2, T1.result ) TTT
   pivot
    (MAX(RESULT)
      for CODE2 in ('X' AS X,'Y' AS Y))  
ORDER BY 1,2        

어쩔 수 없으면 http://withoutwing.tistory.com/33 동적쿼리를 참조해 보시지요.

by 우리집아찌 [2013.06.05 17:17:12]
링크 들어갔다가 깜짝놀랐습니다 ㅎㅎㅎ
여인네 그림이 쫙...

by 야신 [2013.06.05 17:34:09]
저와 같은 경험을 하셨군요 (므흣)^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입