Oracle DBA/SQL

20230628 (6) SQL 048 ROW 를 COLUMN 으로 출력하기 2(PIVOT)

Nuez 2023. 6. 28. 15:55
반응형

1. 행(row) -> 컬럼(column) : sum + decode 또는 pivot문

2. 컬럼(column) -> 행(row) : unpivot문


예제. 부서번호, 부서번호별 토탈 월급을 가로로 출력하는데 pivot문을 이용하세요.

1단계

SELECT *
FROM ( SELECT deptno, sal FROM emp);


2단계

SELECT *
FROM (SELECT deptno, sal 
        FROM emp)
PIVOT(SUM(sal) FOR deptno IN (10,20,30));

 

구조 :

Point ! 결과를 보기 위해 필요한 컬럼만 from절의 서브쿼리에 쓴다.

 

SELECT *

FROM (SELECT 결과를 보기 위해 필요한 컬럼,

             FROM 대상 테이블)

PIVOT(보고싶은 연산 결과 FOR 대상컬럼 IN (출력시 컬럼명이 될 값 나열))


문제 244. 직업, 직업별 토탈월급을 가로로 출력하는데 PIVOT문을 써서 구현하시오.

 

SELECT *
FROM ( SELECT job, sal
        FROM emp)
PIVOT ( SUM(sal) FOR job IN ('ANALYST' ,  'CLERK',  'MANAGER' , 'PRESIDENT', 'SALESMAN'));

 

SELECT *
FROM ( SELECT job, sal
        FROM emp)
PIVOT ( SUM(sal) FOR job IN ('ANALYST' AS "ANALYST",
                            'CLERK'AS "CLERK",
                            'MANAGER' AS "MANAGER",
                            'PRESIDENT' AS "PRESIDENT",
                            'SALESMAN'AS "SALESMAN"));

문제 245. 아래 괄호 안에 넣을 SQL을 작성하시오. 

SELECT *
FROM ( SELECT job, sal
        FROM emp)
PIVOT ( SUM(sal) FOR job IN (     ));

위의 피봇문 IN 옆에 직업을 일일이 입력해야하는 부분을 '나름' 소프트 코딩하기 위한 것. 

 

SELECT '''' || job2 || '''' || ' as '||'"'||job2 || '"'|| ','
FROM (SELECT DISTINCT job AS job2
        FROM EMP);

이렇게 한 결과값을 드래그해서 바로 괄호 안에 붙여넣으면, 일일이 쓰지 않아도 됨.  (마지막 행의 콤마 제거)

코드를 그대로 넣는 것이 아님!!!! 결과값을 넣는 것! 


굳이 그럴 필요는 없지만

마지막 행 콤마를 직접 제거하지 않고 한줄로 표현하고 싶다면? 

LISTAGG까지 함께 쓰기 

SELECT LISTAGG(job2_2,',') WITHIN GROUP (ORDER BY job2_2)
FROM (SELECT '''' || job2 || '''' || ' as '||'"'||job2 || '"' AS job2_2
FROM (SELECT DISTINCT JOB AS job2
        FROM emp));