by 토로 [SQL Query] WHERE CASE INSERT INTO [2020.12.24 13:46:26]
안녕하세요. 복습하려고 쿼리 문제를 만들어 보고 있습니다. 근속년수에 맞춰 VACATION 값을 각각 넣어주고 싶은데
생각대로 잘 안 됩니다. INSERT INTO도 오류가 뜨고 CASE로도 오류가 나서 이러지도 저러지도 못하고 있네요..
힌트라도 얻고 싶어 질문 올립니다. 어떻게 접근하면 문제를 완성시킬 수 있을까요?
--1
--근속년수가 10년 미만, 10년 이상 20년 이하, 20년 이상 30년 이하로 그룹을 나누어 유급 휴가를 주려 한다.
--3일, 5일, 7일의 유급 휴가일(VACATION)을 테이블에 추가하여 사원명, 근속년수, 유급 휴가일을 조회하라.
ALTER TABLE EMPLOYEE
ADD VACATION VARCHAR(15);
SELECT EXTRACT(YEAR FROM SYSDATE )- EXTRACT(YEAR FROM HIRE_DATE) 근속년수, VACATION "유급 휴가일"
FROM EMPLOYEE
WHERE
CASE WHEN 근속년수 < 10 THEN VACATION '3일'
CASE WHEN 근속년수 BETWEEN 10 AND 20 THEN VACATION '5일'
END
1. 지난번 질문에서 Select 절의 알리아스인 "근속년수" 를 Where 절에서 사용할 수 없다고 답변 했었는데요.
2. CASE 문의 사용법이 문법에 어긋나네요. THEN 절의 내용이 이상하네요.
3. CASE 문을 WHERE 절에서 사용할게 아니라 Select 절에서 사용해야죠.
4. vacation 은 문자 "3일" 형식 보다는 숫자로 하는게 좋을 듯 합니다.
5. vacation 컬럼의 값을 변경하는 것라면 Insert 가 아니라 Update 를 사용해야죠.
-- 1. 확인용 -- SELECT emp_id , emp_name , hire_date , TO_CHAR(sysdate, 'yyyy') - TO_CHAR(hire_date, 'yyyy') 근속년수 , CASE WHEN TO_CHAR(sysdate, 'yyyy') - TO_CHAR(hire_date, 'yyyy') < 10 THEN 3 WHEN TO_CHAR(sysdate, 'yyyy') - TO_CHAR(hire_date, 'yyyy') < 20 THEN 5 ELSE 7 END vacation FROM employee ; -- 2. 갱신용 -- UPDATE employee SET vacation = CASE WHEN TO_CHAR(sysdate, 'yyyy') - TO_CHAR(hire_date, 'yyyy') < 10 THEN 3 WHEN TO_CHAR(sysdate, 'yyyy') - TO_CHAR(hire_date, 'yyyy') < 20 THEN 5 ELSE 7 END ;
-- 일자까지 고려한 근속년수 -- SELECT emp_id , emp_name , hire_date , TRUNC(MONTHS_BETWEEN(TRUNC(sysdate) + 1, hire_date) / 12) 근속년수 , CASE WHEN MONTHS_BETWEEN(TRUNC(sysdate) + 1, hire_date) / 12 < 10 THEN 3 WHEN MONTHS_BETWEEN(TRUNC(sysdate) + 1, hire_date) / 12 < 20 THEN 5 ELSE 7 END vacation FROM employee ;