메뉴 건너뛰기

tnt_db

Oracle 동일한 값 안보여주기

운영자 2002.09.18 14:25 조회 수 : 2969 추천: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을 줄일 수
    있으리라.
번호 제목 글쓴이 날짜 조회 수
74 TABLE,COLUMN,PROCEDURE 이름을 확인할때... 원우석 2006.03.10 3114
73 NESTED TABLE과 VARRAY사용법과 다른점 박상현 2005.11.03 8834
72 plan table(sql실행계획) 보는 select문 운영자 2003.01.28 3988
71 java에서 array처리 방법 운영자 2003.01.27 6189
70 효율적인 25가지 SQL작성법 운영자 2003.01.04 2948
69 중복 data는 처음에만 display 하게 하는 방법 운영자 2002.11.23 2965
68 중복 data를 찾아 한번만 display하는 방법 운영자 2002.11.23 3428
67 중복 data를 찾아 모두 display 하는 방법 운영자 2002.11.23 3070
66 oracle의 procedure에서의 여러 리턴값의 활용 예 운영자 2002.10.18 8301
65 특정문자까지의 왼쪽 문자열 반환 function 운영자 2002.10.18 4044
64 중복자료 확인 및 삭제 운영자 2002.09.25 3259
63 RECORD단위 DATA를 COLUMN단위로 운영자 2002.09.18 3681
62 누계 COLUMN이 없는 TABLE에 누계 값을 보자 (부등호 JOIN) 운영자 2002.09.18 5104
61 바로이전 ROW의 값을 참조하고자 할때 운영자 2002.09.18 8619
60 누계 COLUMN이 없는 TABLE에 누계 값을 보자 (IN-LINE VIEW) 운영자 2002.09.18 3123
59 자기보다 작은값중 최대값 하나만 읽어오기 운영자 2002.09.18 4588
58 DATA COPY를 이용한 QUERY 운영자 2002.09.18 3186
57 PARAMETER값 변경에따른 유연한 GROUP BY 운영자 2002.09.18 4127
56 PAIRWISE 와 NONPAIRWISE 운영자 2002.09.18 2697
» 동일한 값 안보여주기 운영자 2002.09.18 2969
위로