경진의 블로그

ROWNUM & DECODE 문제풀이 본문

자바개발과정/오라클(Oracle)

ROWNUM & DECODE 문제풀이

aith 2008. 5. 28. 00:15
ROWNUM & DECODE 문제풀이

문제1
TEMP의 자료를 이용하여 한 행에 사번, 성명을 3명씩 보여주는 SQL을 작성한다

사용자 삽입 이미지

ROWNUM을 3으로 나눈값이 0인 사번과 성명을 구한다

SELECT
       DECODE(MOD(ROWNUM,3),0,EMP_ID,NULL) C1
      ,DECODE(MOD(ROWNUM,3),0,EMP_NAME) C2   
  FROM TEMP;

ROWNUM을 3으로 나눈값이 1인 사번과 성명을 구한다

SELECT
       DECODE(MOD(ROWNUM,3),1,EMP_ID) C3
      ,DECODE(MOD(ROWNUM,3),1,EMP_NAME) C4
  FROM TEMP ORDER BY C3;

ROWNUM을 3으로 나눈값이 2인 사번과 성명을 구한다

SELECT
       DECODE(MOD(ROWNUM,3),2,EMP_ID) C5
      ,DECODE(MOD(ROWNUM,3),2,EMP_NAME) C6
  FROM TEMP ORDER BY C5;

CEIL함수를 이용해서 반올림한 값과 ROWNUM으로 순서를 구한값을 비교하기 위해 출력한다

SELECT
       CEIL(NO/3) RNO
      ,MOD(NO,3) CNO
      ,NO
      ,DECODE(MOD(NO,3),1,EMP_ID) C1
      ,DECODE(MOD(NO,3),2,EMP_ID) C2
      ,DECODE(MOD(NO,3),0,EMP_ID) C3   
  FROM (SELECT ROWNUM NO, EMP_ID, EMP_NAME FROM TEMP);

CEIL(NO/3)의 값을 GROUP BY하면 된다

SELECT
       CEIL(NO/3) C0
      ,MAX(DECODE(MOD(NO,3),1,EMP_ID)) C1
      ,MAX(DECODE(MOD(NO,3),1,EMP_NAME)) C2
      ,MAX(DECODE(MOD(NO,3),2,EMP_ID)) C3
      ,MAX(DECODE(MOD(NO,3),2,EMP_NAME)) C4
      ,MAX(DECODE(MOD(NO,3),0,EMP_ID)) C5
      ,MAX(DECODE(MOD(NO,3),0,EMP_NAME)) C6
  FROM (SELECT ROWNUM NO, EMP_ID, EMP_NAME FROM TEMP) GROUP BY CEIL(NO/3);

한 행에 5명씩 보여주는 응용도 할 수 있다

SELECT
       CEIL(NO/5) C0
      ,MAX(DECODE(MOD(NO,5),1,EMP_ID)) C1
      ,MAX(DECODE(MOD(NO,5),1,EMP_NAME)) C2
      ,MAX(DECODE(MOD(NO,5),2,EMP_ID)) C3
      ,MAX(DECODE(MOD(NO,5),2,EMP_NAME)) C4
      ,MAX(DECODE(MOD(NO,5),3,EMP_ID)) C5
      ,MAX(DECODE(MOD(NO,5),3,EMP_NAME)) C6
      ,MAX(DECODE(MOD(NO,5),4,EMP_ID)) C7
      ,MAX(DECODE(MOD(NO,5),4,EMP_NAME)) C8
      ,MAX(DECODE(MOD(NO,5),0,EMP_ID)) C9
      ,MAX(DECODE(MOD(NO,5),0,EMP_NAME)) C10
  FROM (SELECT ROWNUM NO, EMP_ID, EMP_NAME FROM TEMP)
 GROUP BY CEIL(NO/5);

첨부 파일


문제2
다음과 같이 화면에 출력되게 SQL문을 작성한다

사용자 삽입 이미지

순서가 정해져 있도록 하고 수량을 참조하기 위해 수량1과 수량2를 두고 정렬을 한다

SELECT name_vc,quantity_nu q1,quantity_nu q2 FROM t_giftorder;

위의 쿼리를 서브쿼리로 두고 밖에서 ROWNUM을 정한 뒤 2로 나누면 값이 0과 1로 나뉘게 된다
MOD(ROWNUM,2) 이 값을 DECODE로 분리하여 0과 1일때 q1(수량1)을 뿌릴 것인지 q2(수량2)를 뿌릴 것인지를 결정하고 두 DECODE사이에 ||','||로 CONCAT시킨다

SELECT
       DECODE(MOD(ROWNUM,2),1,q1) ||','||DECODE(MOD(ROWNUM,2),0,q2) value
  FROM (
        SELECT name_vc,quantity_nu q1,quantity_nu q2
          FROM t_giftorder
        ORDER BY name_vc
       );

이제 메인쿼리에 name_vc를 추가하고 DECODE에 그룹 함수를 씌워준 후 name_vc로 GROUP BY를 하면 된다

SELECT
       name_vc
      ,MIN(DECODE(MOD(ROWNUM,2),1,q1)) ||','||MIN(DECODE(MOD(ROWNUM,2),0,q2)) value
  FROM (
        SELECT name_vc,quantity_nu q1,quantity_nu q2
          FROM t_giftorder
        ORDER BY name_vc
       )
GROUP BY name_vc;

'자바개발과정 > 오라클(Oracle)' 카테고리의 다른 글

이전 레코드 값 참조 방법(전일 환율)  (0) 2008.05.28
ROW와 COLUMN의 상호호환  (0) 2008.05.28
ROWNUM & DECODE 문제풀이  (0) 2008.05.28
HIERACHICAL SELECT(계층질의)  (0) 2008.05.28
DECODE(IF문)  (0) 2008.05.27
ROWNUM  (0) 2008.05.27
0 Comments
댓글쓰기 폼