문제
춘 기술대학교의 재수생 입학자 학번과 이름을 표시하시오.(이때, 19살에 입학하면 재수를 하지 않은 것으로 간주)
내가 생각한 로직
-- 태어난 년도 + 19년 != ENTRANCE_ DATE
-- 주민등록번호 앞 두자리 => YY 포맷으로 변경
-- 변경된 포맷 + 19년(==228개월) => 입학한 년도
-- EXTRACT (YEAR FROM ENTRANCE_DATE) => 입학년도를 4자리로 추출 ?
-- 주민번호를 가지고 태어난 년도 조회 성공 -> 하지만 모두 3/1로 조회됨
-- 20살이 되었을 해 조회 성공 -> 태어난 년도에서 228개월을 더했을 시점 == 20살이 되었을 해
-- ENTRANC_DATE가 20살이 되었을 해보다 늦을 때 == 재수를 했다
SELECT STUDENT_NAME, TO_DATE(SUBSTR(STUDENT_SSN,1,2),'YYYY')"태어난년도"
,ADD_MONTHS(TO_DATE(SUBSTR(STUDENT_SSN,1,2),'YY'),228) "20살이 되었을 해"
,ENTRANCE_DATE
FROM TB_STUDENT
WHERE ADD_MONTHS(TO_DATE(SUBSTR(STUDENT_SSN,1,2),'YY'),228) > ENTRANCE_DATE;
올바른 접근방법
-- 문제에서 요구하는 내용은 현역과 삼수생을 모두 제외한 재수생만 추려내는 것 (삼수생도 포함한 결과는 245행)
-- 0301생인 김정현 학생을 제외시키기 위해 19 초과 20 이하라는 조건식 사용
SELECT STUDENT_NO, STUDENT_NAME--, MONTHS_BETWEEN(ENTRANCE_DATE, TO_DATE(SUBSTR(STUDENT_SSN, 1, 6), 'RRMMDD'))/12
FROM TB_STUDENT
WHERE MONTHS_BETWEEN(ENTRANCE_DATE, TO_DATE(SUBSTR(STUDENT_SSN, 1, 6), 'RRMMDD'))/12 > 19
AND MONTHS_BETWEEN(ENTRANCE_DATE, TO_DATE(SUBSTR(STUDENT_SSN, 1, 6), 'RRMMDD'))/12 <= 20;
틀린이유
기준점을 태어난 년도에서 228개월을 더하는 것이 아닌, 입학년도와 태어난년도/12의 값을 가지고 비교하는 것이다.
MONTHS_BETWEEN(DATE1,DATE2) :
DATE1 => 입학년도
DATE2 => 주민등록번호 앞 자리 (SUBSTR(STUDENT_SSN,1,6)를 생년월일 (TO_DATE)값으로 변경하기
이제, 둘 다 DATE TYPE임으로 MONTHS_BETWEEN 함수를 사용할 수 있다.
그럼 입학년도와 태어난년도 사이의 개월 수를 확인할 수 있고,
그 개월 수 / 12 한 값이 19 초과하면서, 20 이상이거나 같을 경우 재수생을 추릴 수 있다.
'🚨 Error > ORACLE' 카테고리의 다른 글
[Oracle] column ambiguously defined / must name this expression with a column alias (0) | 2021.03.24 |
---|---|
[Oracle] FINALWORKSHOP (6) 오답 정리 (0) | 2021.03.22 |
[Oracle] 비등가 조인을 활용하여 문제 풀기 (0) | 2021.03.12 |
[Oracle] 두 개이상의 테이블을 외부조인 하는 방법 (0) | 2021.03.12 |
[Oracle] 같은 문제에 DECODE 와 CASE WHEN THEN 적용해보기 (0) | 2021.03.09 |
댓글