문제) 사원의 총수, 급여가 1500 이상인 사원의 수와 비율을 아래와 같이 알고 싶습니다.
(비율은 소숫점 이하 둘째자리까지 반올림)
총사원수 급여>=1500 비율
--------- ----------- ----------
14 8 57.14%
풀이) 아래와 같은 집합을 생각하세요.
총수 급여>=1500
---------- ----------
800
1600 1600
1250
2975 2975
1250
2850 2850
2450 2450
3000 3000
5000 5000
1500 1500
1100
950
3000 3000
1300
위 집합의 각 컬럼에 count 함수를 적용하면 문제를 해결할 수 있습니다.
위와 같은 집합을 만들기 위한 쿼리를 작성해보면
1) DECODE 함수 사용
select sal, sal
from emp;
↓ ↓ ↓
select sal as 총사원수
, decode(trunc(sal/1500), 0, to_number(null), sal) as "급여>=1500"
from emp;
↓ ↓ ↓
select count(sal) as 총사원수
, count(decode(trunc(sal/1500), 0, to_number(null), sal)) as "급여>=1500"
from emp;
↓ ↓ ↓
select count(sal) as 총사원수
, count(decode(trunc(sal/1500), 0, to_number(null), sal)) as "급여>=1500"
, round(count(decode(trunc(sal/1500), 0, to_number(null), sal)) / count(sal) * 100, 2)||'%' as 비율
from emp;
2) CASE expression 사용
select sal, sal
from emp;
↓ ↓ ↓
select sal as 총사원수
, case when sal >= 1500 then sal end as "급여>=1500"
from emp;
↓ ↓ ↓
select count(sal) as 총사원수
, count(case when sal >= 1500 then sal end) as "급여>=1500"
from emp;
↓ ↓ ↓
select count(sal) as 총사원수
, count(case when sal >= 1500 then sal end) as "급여>=1500"
, count(case when sal >= 1500 then sal end) / count(sal) as 비율
from emp;
↓ ↓ ↓
select count(sal) as 총사원수
, count(case when sal >= 1500 then sal end) as "급여>=1500"
, round(count(case when sal >= 1500 then sal end) / count(sal) * 100, 2)||'%' as 비율
from emp;