동일 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을 줄일 수
있으리라.
조건.
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을 줄일 수
있으리라.