메뉴 건너뛰기

tnt_db

Oracle 동일한 값 안보여주기

운영자 2002.09.18 14:25 조회 수 : 2778 추천:14

동일 COLUMN값 안보여주기

조건.
    TABLE : TEST09

    열 이름                        널?      유형
    ------------------------------ -------- ----
    공정                                    VARCHAR2(3)
    SPEC                                    VARCHAR2(10)
    부품                                    VARCHAR2(8)
    갯수                                    NUMBER

    공정  SPEC       부품           갯수
    ----  ------     ------         ----
    01    A001       P01               1
    01    A001       P03               1
    점점점.... 중략    
    01    A002       P02               4
    01    A002       P04               4
    점점점.... 중략    
    01    A003       P01               3
    01    A003       P03               3
    03    A002       P02               2
    03    A004       P09               4
    점점점....      
문제.
    위의 DATA는 TEST09의 DATA중에서 부품이 'P0' 으로 시작되는 것만
    읽어 왔다.
    조회용 QUERY로 만들어 다음처럼 나오게 하고 싶으면 어떻게 하면
    될까?.

    공정  SPEC       부품           갯수
    ----  ------     ------         ----
    01    A001       P01               1
                     P03               1
                     P04               1
                     P07               1
                     P08               1
          A002       P02               4
                     P04               4
                     P05               4
                     P07               4
                     P08               4
          A003       P01               3
                     P03               3
                     P04               3
                     P06               3
                     P07               3
    점점점.....

      한마디로 공정이 전RECORD의 공정과 같으면 공정을 안 보이게 하고
      공정과 SPEC이  전RECORD의 것과 같으면 SPEC을 안 보이게 하고 싶다.

생각.
    앞의 주제를 완벽하게 소화하고 이 주제를 읽고 있다면 별로 어려운
    문제가 아닌 듯 하다.
    엿보기1.이미 우리가 앞 주제에서 다뤘던 SELF JOIN을 이용하여 전번
            RECORD값을 읽어 현재값과 비교할 수 있다는 것을 알고 있다.
    엿보기2.위와같은 사실을 알고 있다면 일반적으로 APLLICATION
            PROGRAM에서 REPORT를 찍을때 사용하는 방법처럼 전번
            RECORD의 값과  현재값을 비교해 값이 같으면 안 보여주면
            된다.
    한번 스스로 작성해 보자.
            
해법.
    단계1.전번 RECORD를 읽어오는 원리를 잠간 다시 설명하면 이렇다.
          TEST09 TABLE에 ROWNUM을 COLUMN값으로 추가시켜 동일하게
          두번 읽어와 IN-LINE VIEW로 사용하되 ALIAS 만 다르게 준다.    

          SELECT 어쩌구저쩌구
          FROM (SELECT ROWNUM CNT1,공정,SPEC,부품,갯수
                FROM   TEST09
                WHERE 부품 LIKE 'P0%'
               ) A,
               (SELECT ROWNUM CNT2,공정,SPEC
                FROM   TEST09
                WHERE 부품 LIKE 'P0%'
               ) B
    단계2. 단계1의 A IN-LINE VIEW를 기준DATASET으로 사용하여
           JOIN을 걸되, B IN-LINE VIEW는 전번값을 가져오기 위한
           목적이므로 다음과 같은 조건을 추가한다.
           WHERE B.CNT2(+) = A.CNT1 - 1
           그러면 다음과 같이 된다.
           SELECT A.CNT1,A.공정,A.SPEC,
                  B.CNT2,B.공정,B.SPEC
           FROM (SELECT ROWNUM CNT1,공정,SPEC,부품,갯수
                 FROM   TEST09
                 WHERE 부품 LIKE 'P0%'
                ) A,
                (SELECT ROWNUM CNT2,공정,SPEC
                 FROM   TEST09
                 WHERE 부품 LIKE 'P0%'
                ) B
           WHERE B.CNT2(+) = A.CNT1 - 1
           OUTER JOIN 이 되는 이유는 첫번째 RECORD는 전번값으로
           짝지어질 DATA가 없으므로 붙게된다.
           이렇게 해 놓고 결과 값을 잠시보면 다음과 같이 된다.

           CNT1     A.공정  A.SPEC       CNT2     A.공정  A.SPEC      
           -------- ------  ----------   -------- ------  ----------
                  1 01      A001                                
                  2 01      A001                1 01      A001      
                  3 01      A001                2 01      A001      
                  4 01      A001                3 01      A001      
                  5 01      A001                4 01      A001      
                  6 01      A002                5 01      A001      
                  7 01      A002                6 01      A002      
                  8 01      A002                7 01      A002      
                  9 01      A002                8 01      A002      
                 10 01      A002                9 01      A002      
           점점점....      
    단계3.이제 COLUMN을 읽어오면된다.
          이때 공정 에는 DECODE(A.공정,B.공정,NULL,A.공정),
               SPEC 에는 DECODE(A.공정||A.SPEC,B.공정||
                                B.SPEC,NULL,A.SPEC)
          와 같이 DECODE문을 걸어주면 된다.
          최종문장은 다읍과 같이 될것이다..

    SELECT DECODE(A.공정,B.공정,NULL,A.공정) 공정,
           DECODE(A.공정||A.SPEC,B.공정||B.SPEC,NULL,A.SPEC) SPEC,
           부품,갯수
    FROM (SELECT ROWNUM CNT1,공정,SPEC,부품,갯수
          FROM   TEST09
          WHERE 부품 LIKE 'P0%'
         ) A,
         (SELECT ROWNUM CNT2,공정,SPEC
          FROM   TEST09
          WHERE 부품 LIKE 'P0%'
         ) B
    WHERE B.CNT2(+) = A.CNT1 - 1

뒷풀이.
    언제 쓰일수 있는가?.
    APPLICATION PROGRAM 에서 흔히 요구되는 사항이다.
    QUERY후 추가적인 가공없이  있는모습 그대로를 보여만 주면 된다.
    한가지 원리만 제대로 이해하고 있으면 다양하게 응용해서 써먹을
    수 있다.
    거기에 새로운 응용력을 더해 아이디어까지 추가된다면 DATABASE
    HANDLING에 자신이 붙고 재미가 있어질 것이다.
    우선은 DATABSE HANDLING에 필요한 기본적인 SQL사용법과 함수사용법등을
    익히고 나서 이러한 주제들을 익힌다면 많은량의 CODING을 줄일 수
    있으리라.
번호 제목 글쓴이 날짜 조회 수
86 LENGTH/LENGTHB,SUBSTR/SUBSTRB,INSTR/INSTRB 운영자 2002.09.18 4050
85 PARAMETER값 변경에따른 유연한 GROUP BY 운영자 2002.09.18 4040
84 최대값과 최소값을 뺀 평균 운영자 2002.09.18 3941
83 한번 읽은 테이블로 백분율 구하기 운영자 2002.09.18 3834
82 plan table(sql실행계획) 보는 select문 운영자 2003.01.28 3831
81 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (2) 박상현 2006.06.13 3816
80 sybase DB에서 파일로 백업을 받구 그파일을 다시 DB2로 임포트하는방법 원우석 2004.07.31 3748
79 특정문자까지의 왼쪽 문자열 반환 function 운영자 2002.10.18 3743
78 row데이터 연결하여 조회 구퍼 2009.03.31 3663
77 년중 몇번째 주간인지 알아내기(FUNCTION) - ORACLE이 제공하는 것과 다름 운영자 2002.09.17 3630
76 최단거리찾기 혹은 멀리 떨어진 두지점간의 거리의 합구하기 박상현 2006.11.07 3608
75 다수 NULL 허용 COLUMN의 명칭을 가져올때 운영자 2002.09.18 3572
74 문자열 행으로 분리하기 박상현 2006.06.13 3552
73 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (1) 박상현 2006.06.13 3537
72 복제를이용한 합계계에서 비율계산 운영자 2002.09.18 3534
71 RECORD단위 DATA를 COLUMN단위로 운영자 2002.09.18 3507
70 sql 문 실행명령 원우석 2004.07.31 3500
69 최대공약수, 최소공배수 구하기 박상현 2006.06.13 3479
68 PL/SQL에서 쿼리시 Array Processing 처리방법 박상현 2006.10.27 3469
67 반올림 DATA의 오차보정 운영자 2002.09.18 3463
위로