안녕하세요.
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 |
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 ;