emp 테이블에서 연봉(sal)이 1000미만이면 0.8% 인상, 1000~2000이면 0.5%, 2000~3000이면 0.3%, 그 이상은 0.1%인상되었을 때, emp 테이블의 ename, sal(인상 전 급여), 인상 후 급여를 출력하시오.
먼저 emp 테이블에서 ename과 sal을 출력해보자
select ename, sal from emp;
여기에서 구간을 나눠서 급여인상율을 다르게 적용하자
sal < 1000 0.8%인상, 1000~2000 0.5%, 2001~3000 0.3%, 그 외는 0.1% 인상
① 급여에 따라 급여 인상율 다르게 적용하기 - decode
decode..,,날 아주 혼란스럽게 만드는 녀석,,,,,후
차근차근 정리를 해봅시당
decode(컬럼, 조건1, 결과1, 조건2, 결과2, ..., 조건n, 결과n, 결과)
(예)
decode(gender, 'f', '여', 'm', '남', '기타') 성별
그리고 이 문제를 풀려면 알아야 하는 sign함수 (숫자 비교할 때 자주 사용될 듯..?)
sign(양수) => 1 출력
sign(0) => 0 출력
sign(음수) => -1 출력
select ename, sal "인상 전 급여",
decode(sign(sal-1000),
-1, sal*1.08,
0, sal*1.08,
1, decode(sign(sal-2000),
-1, sal*1.05,
0, sal*1.05,
1, decode(sign(sal-3000),
-1, sal*1.03,
0, sal*1.03,
1, sal*1.01))) "인상 후 급여"
from emp;
sal과 인상율 범위의 차를 기준으로 나누어서 sal이 인상 범위(1000,2000,3000)보다 큰 경우에는 또 범위를 나누어서 값을 설정해주어야 했기 때문에 decode안에 또 decode가 들어가는....아주 지독한 녀석을 만들어야만 했다..,
② 급여에 따라 급여 인상율 다르게 적용하기 - case
case는 조건에 따라 결과값이 다른 경우에 사용된다.
case
when 조건1 then 결과1
when 조건2 then 결과2
when 조건n then 결과n
else 결과
end;
select ename, sal "인상 전 급여",
case when sal between 0 and 1000 then sal*1.08
when sal between 1001 and 2000 then sal*1.05
when sal between 2001 and 3000 then sal*1.03
else sal*1.1
end as "인상 후 급여"
from emp;
참고로 컬럼명에는 띄어쓰기 한 문자열이 들어가려면 큰따옴표("")안에 넣어줘야한다!
case가 decode보다 더 쉽게 작성할 수 있고 코드만 봤을 경우에도 가독성이 좋다bb
물론 비교 대상(조건)이 별로 없다면 decode가 더 유용할듯~
* decode, case 관련 영상
https://www.youtube.com/watch?v=1p8aB506LkU
* case
https://www.w3schools.com/sql/sql_case.asp
SQL CASE Expression
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
'DataBase' 카테고리의 다른 글
[DataBase] 누구인가? 누가 나의 데이터베이스를 가져갔는가 (0) | 2023.07.20 |
---|---|
[DB설계] 하나의 게시글에 여러 개의 태그를 등록하고 싶은데 왜 tag테이블이 두 개가 필요한가 (0) | 2023.07.05 |
[Oracle] PL/SQL 스토어드 프로시저(Stored Procedure) 간단 정리 + 내가 자주내는 오류 녀석들 (0) | 2023.04.03 |
[Oracle] Foreign key 제약사항 (0) | 2023.03.28 |
[Oracle] insert에 대하여 알아보자 (0) | 2023.03.28 |