본문 바로가기

Oracle/SQL Question

[퀴즈] LEAD,LAG 함수 응용 퀴즈

출처 : PRODBA 카페

다음과
테이블(변경전 테이블) 있다고 가정했을때 해당 테이블에 ERR_TYPE(오류유형)이라는 컬럼을 추가하고 싶은데요

오류유형 컬럼은  같은 컬럼영문명(COL_ENG_NM) 대상으로  컬럼한글명, 데이터 타입, 길이를 비교하여 다른것에 대한 오류 유형을 나타나려고 하는데요.

예를 들어 컬럼영문명이 같은데 데이터 타입이 다르면 '데이터 타입 불일치'

              컬럼영문명이 같은데 컬럼한글명이 다르면 '컬럼한글명 불일치'

              컬럼영문명이 같은데 컬럼길이가 다르면 '데이터 길이 불일치'

이런식으로 '변경후 테이블' 처럼 나타나고 싶습니다.

변경전 테이블

COL_ENG_NM

COL_HAN_NM

DATA_TYPE

LEN

A

에이

CHAR

14

A

에이

VARCHAR2

14

B

NUMBER

7

B

삐이

NUMBER

7

C

VARCHAR2

10

C

VARCHAR2

12

         

변경후 테이블

COL_ENG_NM

COL_HAN_NM

DATA_TYPE

LEN

ERR_TYPE

A

에이

CHAR

14

데이터타입 불일치

A

에이

VARCHAR2

14

데이터타입 불일치

B

NUMBER

7

컬럼한글명 불일치

B

삐이

NUMBER

7

컬럼한글명 불일치

C

VARCHAR2

10

데이터길이 불일치

C

VARCHAR2

12

데이터길이 불일치


=>정답 트리플 클릭                                                                                                                  
SELECT A.COL_ENG_NM,COL_HAN_NM,DATA_TYPE,LEN,NVL(LEAD(A.C) OVER (PARTITION BY A.COL_ENG_NM ORDER BY ROWNUM),A.C)
FROM
(
SELECT DPTEST.*,
DECODE(COL_HAN_NM,NVL(LAG(COL_HAN_NM) OVER (PARTITION BY COL_ENG_NM ORDER BY ROWNUM),COL_HAN_NM),NULL,'컬럼한글명 불일치') ||
DECODE(DATA_TYPE,NVL(LAG(DATA_TYPE) OVER (PARTITION BY COL_ENG_NM ORDER BY ROWNUM),DATA_TYPE),NULL,'데이터타입 불일치') ||
DECODE(LEN,NVL(LAG(LEN) OVER (PARTITION BY COL_ENG_NM ORDER BY ROWNUM),LEN),NULL,'데이터길이 불일치') C
FROM DPTEST
) A