[SQL] 분석함수 SUM + DECODE

·2025년 7월 4일

SQL

목록 보기
62/126

column을 row로 출력하기


문제1. 부서번호, 부서번호별 토탈월급을 세로로 출력하시오

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

문제2. 부서번호, 부서번호가 10번이면 월급을 출력하고 그렇지 않으면 null 을 출력하시오

select deptno, decode(deptno, 10, sal, null)
 from emp;

문제3. 부서번호 10번의 월급을 다 합쳐서 출력하시오

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

💡

  • 컬럼별칭 사용시 숫자를 사용하려면
    반드시 ** 더블 쿼테이션 마크(" ") **를 사용해야함
  • 오라클 전체를 통틀어서 더블 쿼테이션 마크(" ")를 쓰는 경우는
    이 경우 밖에 없고, 나머지는 전부 ** 싱글 쿼테이션 마크(' ') **

문제4. 위의 예제처럼 부서번호, 부서번호별 토탈월급을 가로로 출력하시오

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

문제5. 직업, 직업별 토탈월급을 세로로 출력하시오

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

문제6. 직업, 직업별 토탈월급을 가로로 출력하시오

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

문제7. emp21 테이블에서 통신사, 통신사별 평균나이를 세로로 출력하시오

select telecom, round(avg(age))
 from emp21
 group by telecom;

문제8. emp21 테이블에서 통신사, 통신사별 평균나이를 가로로 출력하시오

select round(avg(decode(telecom, 'SKT', age, null))) "SKT",
       round(avg(decode(telecom, 'KT', age, null))) "KT",
       round(avg(decode(telecom, 'LG', age, null))) "LG"
 from emp21;


문제9. 부서번호, 부서번호별 인원수를 세로로 출력하시오

select deptno, count(*) 인원수
 from emp
 group by deptno;

문제10. 부서번호, 부서번호별 인원수를 가로로 출력하시오

select  sum(decode(deptno, 10, 1, null)) as "10",
        sum(decode(deptno, 20, 1, null)) as "20",
        sum(decode(deptno, 30, 1, null)) as "30"
 from emp;
 
 
 -- 또는
 
 
 select  count(decode(deptno, 10, 1, null)) as "10",
         count(decode(deptno, 20, 1, null)) as "20",
         count(decode(deptno, 30, 1, null)) as "30"
 from emp;

문제11. (SQLP 주관식 시험) 직업, 부서번호, 직업별 부서번호별 인원수를 출력하시오

select job, sum(decode(deptno, 10, 1, null)) "10",
            sum(decode(deptno, 20, 1, null)) "20",
            sum(decode(deptno, 30, 1, null)) "30"
 from emp
 group by job;

💡 group by 필수
안쓰면 단일행 함수라서 에러발생


문제12. (SQLP 주관식 시험) emp21 테이블에서 통신사, 통신사별 인원수를 가로로 출력하시오

select  count( decode( telecom, 'SKT', 1, null) ) as "SKT",
        count( decode( telecom, 'LG', 1, null) ) as "LG",
        count( decode( telecom, 'KT', 1, null) ) as "KT"
 from emp21;

문제13. (SQLP 주관식 시험) 나이, 통신사, 나이별 통신사별 인원수를 출력하시오

select age, count(decode(telecom, 'SKT', age, null)) "SKT",
            count(decode(telecom, 'KT', age, null)) "KT",
            count(decode(telecom, 'LG', age, null)) "LG"
 from emp21
 group by age
 order by age;

문제14. 위의 결과를 다시 출력하는데 옆에 전체 인원수가 같이 출력되게하시오

select age, count(decode(telecom, 'SKT', 1, null)) as "SKT",
            count(decode(telecom, 'LG', 1, null)) as "LG",
            count(decode(telecom, 'KT', 1, null)) as "KT",
            count(*) as 인원수
 from emp21
 group by age
 order by age asc;

문제15. (SQLP 주관식 시험)

select nvl(to_char(age), '토탈') as age, count(decode(telecom, 'SKT', 1, null)) as "SKT",
                                        count(decode(telecom, 'LG', 1, null)) as "LG",
                                        count(decode(telecom, 'KT', 1, null)) as "KT",
                                        count(*) as 인원수
 from emp21
 group by rollup(age)
 order by age asc;

0개의 댓글