hyeonga_code

Database_69_그룹 함수_LISTAGG 함수, PIVOT 함수 본문

Oracle Database

Database_69_그룹 함수_LISTAGG 함수, PIVOT 함수

hyeonga 2023. 8. 22. 05:59
반응형

-- 그룹 함수

    -- LISTAGG 함수
        -- 데이터를 그룹화 한 상태에서 각 그룹 안에 특정 필드 값을 한 행으로 출력합니다.
            -- 여러 행의 열 값을 한 행의 값으로 가져와야 할 때 사용하는 그룹 함수입니다.
            -- 그룹화된 개별 데이터를 하나의 열에 가로로 출력합니다.
        /*
        SELECT LISTAGG( column1, '구분자') WITHIN GROUP ( ORDER BY column2 )
        FROM table
        GROUP BY column_name;
            -- column1 : 가로로 출력될 열의 이름입니다.
            -- ORDER BY column2 : 결과를 가로로 출력되는 데이터로 정렬합니다.
        */

-- 부서를 확인합니다.
SELECT department_id, last_name
FROM employees
ORDER BY 1,2;



-- 같은 부서의 사람들의 수와, 이름을 가로로 나열합니다.
SELECT department_id, COUNT(*), LISTAGG(last_name, ',') WITHIN GROUP (ORDER BY salary DESC) AS ename
FROM employees
GROUP BY department_id;



    -- PIVOT 함수
        -- 통계에서 많이 사용합니다.
        -- 행을 열로 변환해주는 함수입니다.
        /*
        SELECT column1
        FROM [table | Subquery]
        PIVOT ( group_function FOR column2 IN (value,…) )   
        [ORDER BY…];
            -- 그룹 함수를 PIVOT 함수 안에 작성합니다.
            -- 그룹 함수를 사용하여 그루핑 대상을 정의합니다.
            -- column1 : PIVOT 대상 테이블 또는 서브쿼리를 의미합니다.
            -- column2 : 가로로 출력할 PIVOT의 기준 열이 됩니다.
        */

-- 직책별 최고 급여를 조회합니다.
SELECT *
FROM  ( SELECT department_id, job_id, salary FROM employees
            WHERE department_id IN (50, 60, 80) )
PIVOT ( MAX(salary) FOR department_id IN (50, 60, 80) );




-- 부서별 최고 급여를 조회합니다.
SELECT *
FROM (SELECT job_id, department_id, salary FROM employees
            WHERE department_id IN (50,60, 80) )
PIVOT ( MAX(salary) FOR job_id IN ('IT_PROG','SA_MAN','SA_REP', 'ST_CLERK', 'ST_MAN') )
ORDER BY department_id;



-- PIVOT 함수를 사용하여 부서별 입사 월을 분류합니다.
SELECT * 
FROM ( SELECT job_id , 
            TO_CHAR(hire_date, 'fmMM') || '월' AS hire_month 
            FROM employees ) 
PIVOT ( COUNT(*) 
            FOR hire_month IN ( '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월' ) );

-- DECODE/GROUP 함수를 사용하여 같은 결과를 출력합니다.
SELECT job_id
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '1', 1, 0)) "1월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '2', 1, 0)) "2월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '3', 1, 0)) "3월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '4', 1, 0)) "4월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '5', 1, 0)) "5월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '6', 1, 0)) "6월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '7', 1, 0)) "7월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '8', 1, 0)) "8월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '9', 1, 0)) "9월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '10', 1, 0)) "10월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '11', 1, 0)) "11월" 
        , SUM(DECODE(TO_CHAR(hire_date, 'fmMM'), '12', 1, 0)) "12월" 
FROM employees 
GROUP BY job_id;

반응형