본문 바로가기

나 취준생/SQL

SQL - 컬럼을 ROW로 출력하기

320x100

1. COLUMN을 ROW로 출력하는 방법 1 ( SUM + DECODE )


일단 먼저, emp 테이블의 부서번호 (deptno) 별로 월급의 총합을 확인하고 싶다고 가정하자.


select deptno, sum(sal)

 from emp

 group by deptno

 order by deptno;


이것을 가로로 출력해야하면 어떻게 할까?


이전에 배운 DECODE 함수를 활용해야 한다.


DECODE ( 컬럼명, 조건1, 출력 1, 조건2, 출력 2, 그 외 출력 3 ) 으로 실행되는데,


예제로 


select  decode( deptno, 10, sal , 0  )  

   from  emp;


를 실행해보자


이렇게하면 부서 번호가 10인 경우만 sal(월급) 이 출력되고 나머지 20, 30 같은 경우는 0이 출력된 것을 볼 수 있다.

이 행을 띄우면 다음은 간단하다.


sum으로 이 모든 행을 더해주면

다음과 같이 딱 한 행에 부서번호가 10인 사원들의 월급 총합이 구해진다.


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

   from  emp;



그렇다면 한 번에 다른 부서들도 해보자.


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;




***

select  sum( decode( telecom, 'sk', age, 0  )  )  as  "sk",

         sum( decode( telecom, 'lg', age, 0  )  )  as  "lg",

         sum( decode( telecom, 'kt', age, 0  )  )  as  "kt"

   from  emp12;


이 코드는 정상적으로 작동하지만, 이것이 엄청난 크기의 데이터라고 가정했을 때, 효율을 크게 높일 수 있는 방법이 있다.

한 부분만 바꿔주면 되는데, 어디일까?


select  sum( decode( telecom, 'sk', age )  )  as  "sk",

         sum( decode( telecom, 'lg', age  )  )  as  "lg",

         sum( decode( telecom, 'kt', age,  null )  )  as  "kt"

   from   emp12;


정답은 0 대신 비워놓거나 null 값을 넣는 것이다.


이전에 언급한 적이 있는데 sum, avg 같은 집계 함수는 null 값을 바로 건너뛰어버린다.

하지만 잘못된 예시처럼 0으로 바꾸면 집계 할 때 일일이 다 계산 과정에 포함시키기 때문에 값이 잘못되거나 느려질 수 있다.



2. COLUMN을 ROW로 출력하는 방법 2 ( PIVOT )


세로를 가로로 출력하는 함수 PIVOT


select * from (피벗할 쿼리문) as result pivot ( 그룹함수(집계컬럼) for 피벗대상컬럼 in ([피벗컬럼값]...) as pivot_result


예제 : 

select   *       <-- pivot 문 사용할 때는 그냥 * 를 쓰는 게 좋다

        from  ( select  deptno, sal  from  emp )  <-- 사원 테이블에서 그냥 

                                                                   부서번호와 월급만 가져온다.  (emp 테이블명만 딱 쓸 수 없다.)

                                                                   결과를 보기위해서 필요한 컬럼만 선별해서 가져온다. 

      

        pivot   (  sum(sal)  for  deptno  in ( 10, 20, 30 )  )  ;

                       ↓        

                    토탈월급을 출력하겠다. 어떤 토탈월급?  부서번호를 위한 

                    어떤 부서번호 ?  10번, 20번, 30번의 부서번호 





반응형

'나 취준생 > SQL' 카테고리의 다른 글

SQL - 테이블 조인  (0) 2020.11.07
SQL - 데이터 분석 함수 2  (0) 2020.11.05
SQL - listagg, lag, lead  (0) 2020.11.05
SQL - 데이터 분석 함수 1  (0) 2020.11.05
SQL - 복수행 함수  (0) 2020.11.04