오라클 LEVEL 잘 사용하기(가로컬럼을 세로로 변환)

오라클에서 LEVEL은 순차적자료를 나열할때 꼭쓰이고 있습니다. 특히 날짜관련 자료를 다룰때 혹은 통계 쿼리에서 많이 사용이 되는데 한번 살펴 보겠습니다.

 

SELECT LEVEL 
  FROM dual 
 CONNECT BY LEVEL <=10 

 

예제를 실행한 결과입니다.

 

 


1부터 10까지의 목록을 출력하는 예제 입니다. 1부터 10까지 나열되고 있는게 보이실꺼에요. 그러면 조금 더 응용을 해볼께요.

 

SELECT TO_CHAR(TO_DATE('20150701','YYYYMMDD')+LEVEL-1,'YYYYMMDD') DAY
 FROM DUAL
CONNECT BY LEVEL <= 31

 

 

7월1일부터 31일 이하의 날짜를 구하는 쿼리입니다. 조금더 응용하면 현재월의 날짜를 구할수가 있습니다. TO_DATE('20150701','YYYYMMDD') 여기 부분을 SYSDATE로 바꾸면 되겠죠. 데이터형으로 변환해서 처리하기 때문에 숫자가 현재월을 넘어가면 다음달로 넘어가니 잘 응용해서 사용하시기 바랍니다.

 

예제를 살펴보시면 아시겠지만 CONNECT BY LEVEL 에서 LEVEL에 표기될 숫자를 지정할 수가 있습니다. 100개이든 1000개이든 그 숫자그대로 목록을 나열합니다.

 

이제 LEVEL을 이용한 가로를 세로로 변환하는 쿼리를 살펴보겠습니다.

 

SELECT CASE WHEN ROWNUM = '1' THEN c.컬럼1
            WHEN ROWNUM = '2' THEN c.컬럼2
            WHEN ROWNUM = '3' THEN c.컬럼3
            WHEN ROWNUM = '4' THEN c.컬럼4
            WHEN ROWNUM = '5' THEN c.컬럼5
       END AS 세로컬럼                        
  FROM dual A, (SELECT LEVEL lv

                           FROM dual

                         connect BY LEVEL <=5

                        ) b,

            테이블 c
  WHERE ROWNUM = b.lv
    AND c.조건컬럼 = '조건'

 

 

조금더 살펴보면 컬럼의 개수를 자동으로 변환해서 만드는 방법도 가능하겠는데요  그러면 너무 내용이 어려워 질것 같아서 이정도선에서 설명을 드릴께요.

 

LEVEL로 강제로 목록리스트를 만들어줍니다. 한ROW에는 ROWNUM이 붙어있습니다. ROWNUM은 컬럼의 순번을 나타내며 거기에 CASE 명령어를 사용하여 내용을 붙이게 만들었습니다 CASE 와 DECODE 어느것이든 상관이 없지만 개인적으로 CASE명령어를 추천드립니다. DECODE의 경우 조건문내용이 길어질경우 조건 자체를 알아보기 힘들어지기 때문이죠.

 

이렇게 LEVEL은 특정한 조건만 준다면 리스트를만들어 줄수가 있습니다. 그래서 LEVEL은 통계나 계층형쿼리에서 사용을 하고 있습니다. 추가적으로 설명드릴 부분은 START WITH 란 구문이 있는데요. 이부분은 계층형쿼리를 다루면서 다시 말씀드리겠습니다. 수고하셨습니다.