메뉴 건너뛰기

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을 줄일 수
    있으리라.
위로