Study/class note
문제4. SQL / rollup하여 생긴 null값에 데이터 입력하기
chanzae
2021. 11. 12. 21:55
[처음 쓴 코드]
select deptno, case when deptno is null then decode(to_char(grouping(job)),1,'전체토탈',job)
when job is null then decode(to_char(grouping(job)),1,'부서토탈',job)
else job end as job2, sum(sal)
from emp
group by rollup(deptno, job);
처음 쓴 코드로도 문제가 풀렸으나, decode 함수를 굳이 써야 하는지 의문이 생김
[수정코드]
-- 수정코드1
select deptno, case when deptno is null then '전체토탈'
when job is null then '부서토탈'
else job end as job2, sum(sal)
from emp
group by rollup(deptno, job);
-- 수정코드2 grouping 사용
select deptno, case when grouping(deptno)+grouping(job) = 2 then '전체토탈'
when grouping(deptno)+grouping(job) = 1 then '부서토탈'
else job end as job2, sum(sal)
from emp
group by rollup(deptno, job);
수정코드1은 처음 쓴 코드를 다시 정리하여 썼고, 수정코드2는 grouping을 이용해 수식으로도 코드를 작성하였음
[다른 사람이 쓴 코드]
-- 다른사람이 쓴 코드1
select deptno,decode(grouping(deptno)+grouping(job),2,'전체토탈:',1,'부서토탈:',job)as job, sum(sal)
from emp
group by rollup(deptno,job);
-- 다른 사람이 쓴 코드2
select deptno,decode(grouping(deptno),1,'전체토탈:', nvl(job,'부서토탈:')) as JOB, sum(sal)
from emp
group by rollup(deptno,job);
-- 다른 사람이 쓴 코드3
select nvl(to_char(deptno),' ') as부서번호,
decode(grouping(deptno),1,'전체토탈:',nvl(job,'부서토탈:')) as 직업, sum(sal)
from emp
group by rollup(deptno,job) ;
case when이 아닌 decode 함수를 이용해서 코드를 작성함. 수식을 작성할 필요없이 간단하게 코드를 짤 수 있음.
[해결]
1. decode는 간단하게 작성할 수 있기 때문에 빠르지만 조건이 여러개로 복잡하게 나열될 경우에는 case when을 쓰는게 유용함.
2. null값을 치환할 때, 기본적으로 nvl()함수를 이용함. 하지만, decode를 이용해 조건값을 치환하거나 case when에서 is null 연산을 써서 치환할 수 있음.
3. 처음 코드를 짰을 때에는 job 컬럼을 grouping하여 문제를 해결하려했음 > 이 문제의 핵심은 기존 job 컬럼의 null값에 문자를 넣는 것이 아니라 새로운 컬럼을 짜서 job의 데이터를 활용하는 방식으로 풀어야 함
4. grouping을 하면 데이터는 0과 1로 출력됨 > 사칙연산 가능 > 다양한 함수식을 써서 결과를 만들어낼 수 있음
반응형