Oracle 쿼리 도움요청 드립니다. 0 3 932

by 민속주점 [SQL Query] [2017.06.23 12:20:27]


안녕하세요.

Oracle 10g 사용 중에 pivot과 같은 sql을 작성해야하나 제대로 수행되지않아 요청드립니다..

 

<가상 테이블>

WITH TEMP AS
 (
     SELECT 'RED' CLR, '100' C FROM DUAL UNION ALL
     SELECT 'BLACK' CLR, '100' C FROM DUAL UNION ALL
     SELECT 'BLUE' CLR, '100' C FROM DUAL UNION ALL
     SELECT 'RED' CLR, '200' C FROM DUAL UNION ALL
     SELECT 'BLACK' CLR, '200' C FROM DUAL UNION ALL
     SELECT 'BLACK' CLR, '200' C FROM DUAL
 )
 SELECT *
   FROM TEMP;

< 실제 출력해야할 화면 >

조회해온  컬럼  가변적으로 늘어날 수 있음...

CLR1 CLR2 CLR3
RED BLACK BLUE
100 100 100
200 200  
  200  

 

 

 

 

by 마농 [2017.06.23 13:19:24]

SQL 만으로 컬럼을 가변으로 늘릴 수는 없습니다.
그러려면 프로그램에서 동적SQL 을 사용해야 합니다.

WITH temp AS
(
SELECT 'RED' clr, '100' c FROM dual 
UNION ALL SELECT 'BLACK', '100' FROM dual 
UNION ALL SELECT 'BLUE' , '100' FROM dual 
UNION ALL SELECT 'RED'  , '200' FROM dual 
UNION ALL SELECT 'BLACK', '200' FROM dual 
UNION ALL SELECT 'BLACK', '200' FROM dual
--UNION ALL SELECT 'GREEN', '300' FROM dual
)
SELECT NVL(rn, 0) rn
     , NVL2(rn, MIN(DECODE(dr, 1, c)), MIN(DECODE(dr, 1, clr))) clr1
     , NVL2(rn, MIN(DECODE(dr, 2, c)), MIN(DECODE(dr, 2, clr))) clr2
     , NVL2(rn, MIN(DECODE(dr, 3, c)), MIN(DECODE(dr, 3, clr))) clr3
     , NVL2(rn, MIN(DECODE(dr, 4, c)), MIN(DECODE(dr, 4, clr))) clr4
  FROM (SELECT clr, c
             , DENSE_RANK() OVER(ORDER BY clr) dr
             , ROW_NUMBER() OVER(PARTITION BY clr ORDER BY c) rn
          FROM temp
        )
 GROUP BY ROLLUP(rn)
 ORDER BY rn
;

 


by 민속주점 [2017.06.23 18:01:51]

마농님 , 감사합니다.

동적sql 응용해서 마무리하겠습니다.

수고하세요..

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