Oracle/SQL

SQL Sum + Decode 컬럼을 행으로 바꿔 출력

NO:LOO 2021. 11. 22. 17:13

컬럼을 ROW로 출력하기 (1)SUM+DECODE

가로로 뽑기전, 세로로 먼저 출력한다.

문제  : 부서번호, 부서번호별 토탈 월급을 일단 세로로 출력한다.

select deptno, sum(sal) 
from emp 
group by deptno;

문제  : 부서번호, 보너스를 출력 부서번호가 10→ 자기자신의 월급이 출력 그렇지 않으면 그냥 0 이출력

select deptno, decode (deptno , 10 , sal, 0) as 보너스
from emp;

→ 후에 나온 값을 모두 더해준다.(SUM)

부서번호의 10번의 모든 월급을 더하기 때문에 select 바로앞 deptno 컬럼은 삭제한다. 

sum 만 씀.

select sum(decode (deptno , 10 , sal, 0)) as "10"
from emp;

별칭에 숫자를 쓰려면 더블 쿼테이션 마크를 둘러주어야한다.

→ 출력 된 결과에서 총합을 구하려면 바깥쪽에 sum 을 둘러야한다.

문제 191 :

select sum(decode (deptno , 10 , sal, 0)) as "10", 
       sum(decode (deptno , 20 , sal, 0)) as "20",
       sum(decode (deptno , 30 , sal, 0)) as "30" 
 from emp;

→ 가로로 출력 완료

가로로 출력하는이유? 값을 계산하기 위해서

->별칭들은 컬럼이 된다.


문제 192 : 클래스 타입, 클래스 타입별 토탈나이를 세로로 출력

select class_type, sum(age) as 총_나이 
from emp14
group by class_type;

→ 가로로 출력

  1. select decode(class_type, 'A', age, 0) as A 이 값에서 sum 을 해준다. sum 이 마지막에 둘러줘야한다
  2. select sum(decode(class_type, 'A', age, 0)) as A
  3. 후에 다른 타입별 나이출력을 복사 붙여 넣기 하여 쿼리문짠다.

→ 결과

select sum(decode(class_type, 'A', age, 0)) as A, 
       sumecode(class_type, 'B', age, 0)) as B
from emp14;

문제 194 : 직업, 직업별 토탈월급을 세로로 출력

select job, sum(sal) 
from emp 
group by job;

문제 195 : 직업, 직업별 토탈월급 가로로 출력

select sum(decode(job, 'ANALYST', sal,0)) as ANALYST, 
       sum(decode(job, 'CLERK', sal,0)) as CLERK, 
       sum(decode(job, 'MANAGER', sal,0)) as MANAGER, 
       sum(decode(job, 'PRESIDENT', sal,0)) as PRESIDENT,
       sum(decode(job, 'SALESMAN', sal,0)) as SALESMAN
from emp;

⇒ JOB 이 'ANALYST' 이면 월급을 뽑고 ,나머지는 0이다) 를 SUM 하여 'ANALYST' 의 총 합을 구하고,

나머지는 직업별로 복사 붙여 넣기하여 식을 만든다.

→ 가로로 출력 완료

그룹함수는 null 값을 무시한다. 이 특징으로 빠른 SQL 로 튜닝 하는 방법?

select decode(job, 'ANALYST', sal, 0) as ANALYST from emp;

→ 출력해서 이 식을 sum 한다면 0 이 다 더해져서 실행속도가 느려진다.

→ 0 을 null 로 치환해 주면 계산값에서 제외 되므로 쿼리 실행 속도가 빨라진다.

select decode(job, 'ANALYST', sal, null ) as ANALYST
from emp;

→ sum 을 해준다.

select sum(decode(job, 'ANALYST', sal,null) )as ANALYST
from emp;

---

문제 200 : 이름, 입사일, 입사한 년도를 4자리로 출력

select ename, hiredate, to_char(hiredate, 'RRRR')as 입사년도
from emp;



문제 201 : 입사년도를 뽑고 입사 년도별 토탈월급 출력

select  to_char(hiredate, 'RRRR')as 입사년도, sum(sal)
from emp
group by to_char(hiredate, 'RRRR');


→ 토탈월급을 확인한것.  sum을, 나중에 decode 문장 다 쓴다음에 마지막 중첩함수로 쓴다. 

문제 : 위의 내용을 가로로 출력하세요

select
 sum(decode(to_char(hiredate, 'RRRR'), '1981', sal, null)) as"1981",
 sum(decode(to_char(hiredate, 'RRRR'), '1983', sal, null)) as "1983",
 sum(decode(to_char(hiredate, 'RRRR'), '1980', sal, null)) as "1980",
 sum(decode(to_char(hiredate, 'RRRR'), '1982', sal, null)) as "1982"
from emp;


설명 별칭에 숫자쓰려면 " "더블 쿼테이션 마크 쓰기