[Tmax 연수] SQL - 직책별 부서별 급여의 합계를 출력( + 부서별집계 추가)

|부서명     |     영업부|      관리부|      총무부|      전산부|    급여합계|
|---------|----------|----------|----------|----------|----------|
|과장      |      4500|      7400|      4003|         0|     15903|
|대리      |      1800|         0|      4206|         0|      6006|
|부장      |      2000|      3000|      2803|         0|      7803|
|사원      |      3100|      6800|      2706|         0|     12606|
|회장      |      5000|         0|         0|         0|      5000|
-- [ 방법 1 ] - 김철기가 쓴 방법입니다.(select)
--
select s.sajob "부서명",
 (select nvl(sum(s1.sapay),0) from sawon s1 where deptno=10 and s1.sajob=s.sajob ) "영업부",
 (select nvl(sum(s1.sapay),0) from sawon s1 where deptno=20 and s1.sajob=s.sajob ) "관리부",
 (select nvl(sum(s1.sapay),0) from sawon s1 where deptno=30 and s1.sajob=s.sajob ) "총무부",
 (select nvl(sum(s1.sapay),0) from sawon s1 where deptno=40 and s1.sajob=s.sajob ) "전산부",
 sum(s.sapay) "급여합계"
from sawon s group by s.sajob;

-- [ 방법 2 ] - 고경은씨가 쓴 방법입니다.(case)
-- dname을 쓰신걸 deptno로 바꿔보았습니다.--

select sajob "부서명",
 sum(case deptno when 10 then sapay else 0 end) "영업부",
 sum(case deptno when 20 then sapay else 0 end) "관리부",
 sum(case deptno when 30 then sapay else 0 end) "총무부",
 sum(case deptno when 40 then sapay else 0 end) "전산부",
 sum(sapay) "급여합계"
from sawon group by sajob;

-- [ 방법 3 ] - 강사님이 쓴 방법입니다.(decode)
-- 뭔가 화려하고 간결한 강사님의 코드를 원하셨던 분들은 다소 실망이 없잖았을꺼라고 생각합니다만...
--

select s.sajob "직책",
 sum(decode(d.dname,'영업부',s.sapay,0)) "영업부",
 sum(decode(d.dname,'관리부',s.sapay,0)) "관리부",
 sum(decode(d.dname,'총무부',s.sapay,0)) "총무부",
 sum(decode(d.dname,'전산부',s.sapay,0)) "전산부",
 sum(s.sapay) "급여합계"
from sawon s, dept d
where s.deptno = d.deptno
group by s.sajob;
break on report
compute sum label 직책별합계 of 영업부 관리부 총무부 전산부 급여합계 on 직책 report

위의 두 행을 입력하면 아래와 같은 결과가 나온답니다.

직책      |    영업부|    관리부|    총무부|    전산부|  급여합계
----------|----------|----------|----------|----------|----------
과장      |      7400|         0|      4500|      4003|     15903
대리      |         0|         0|      1800|      4206|      6006
부장      |      3000|         0|      2200|      2803|      8003
사원      |      6800|         0|      3100|      2706|     12606
회장      |         0|         0|      5000|         0|      5000
          |----------|----------|----------|----------|----------
**직책별합계|     17200|         0|     16600|     13718|     47518**
Back