hyeonga_code

Database_63_DML 응용_PIVOTING INSERT 본문

Oracle Database

Database_63_DML 응용_PIVOTING INSERT

hyeonga 2023. 8. 20. 06:59
반응형

-- Advanced DML

        -- PIVOTING INSERT
            -- 비관계형 데이터베이스 테이블과 같은 입력 레코드를 관계형 데이터베이스 테이블 환경 레코드로 변환하는 변형 작업을 수행합니다.
            -- ALL 다중 INSERT 구문을 활용하여 비관계형 테이블 열의 각 데이터를 관계형 테이블의 행으로 변환해야 합니다.
                -- 반복되는 행을 모두 컬럼으로 지정하게 되면 NULL 값을 가지는 컬럼이 많아지게 됩니다.
                -- 영수증, 거래 명세표, 세금 계산서 등 장표 구성

-- 사용할 데이터를 조회합니다.
SELECT * FROM sales_source_data;
        -- 요일별로 데이터가 분리되어 있어 그룹 연산을 할 수 없습니다.
        -- 요일 속성이 반복되고 있습니다.
        -- 관계 데이터 테이블은 반복되는 속성을 하나로 묶어 하나의 속성으로 작성해야 합니다.



-- 채워넣을 테이블을 조회합니다.
SELECT * FROM sales_info;
        -- 매출 번호를 입력하기 위해 SALES_ID를 지정합니다.
        -- 요일별 분석을 위해 SALES_DAY를 지정합니다.
 



-- SALES_INFO 테이블의 속성을 조회합니다.
DESC sales_info;
    /*
    이름            널?     유형          
    -----------     --     ----------- 
    SALES_ID             NUMBER(6)   
    EMPLOYEE_ID       NUMBER(6)   
    WEEK_ID              NUMBER(2)   
    SALES_DAY          CHAR(3)     
    SALES                 NUMBER(8,2) 
    */

-- 데이터를 삽입합니다.
    -- 5일을 가진 4열을 실행하므로 20번 실행해야 합니다.
    -- 직원 번호가 주차에 요일에 얼마를 판매했습니다.
INSERT ALL
    INTO sales_info VALUES ( 1, employee_id, week_id, 'MON', sales_MON)
    INTO sales_info VALUES ( 1, employee_id, week_id, 'TUE', sales_TUE)
    INTO sales_info VALUES ( 1, employee_id, week_id, 'WED', sales_WED)
    INTO sales_info VALUES ( 1, employee_id, week_id, 'THU', sales_THUR)
    INTO sales_info VALUES ( 1, employee_id, week_id, 'FRI', sales_FRI)
        -- 5일이므로 한 행에서 5번을 삽입해야 합니다.
SELECT employee_id, week_id, sales_MON, sales_TUE, sales_WED, sales_THUR, sales_FRI
FROM sales_source_data;
    /*
    20개 행 이(가) 삽입되었습니다.
    */


-- SALES_INFO 테이블을 조회합니다.
SELECT * FROM sales_info;
        -- 기본키를 선정하기 위해 EM_ID, WEEK_ID, SALES_DAY, SALES를 묶어야할 수도 있습니다.
            -- 유니크한 키를 만들기 위함입니다.
            -- 너무 길어질 수 있습니다.
            -- 설계에는 없지만 기본 키를 위해 인위적으로 열을 추가합니다.




-- 시퀀스를 사용하여 일련변호를 업데이트 합니다.
UPDATE sales_info
SET sales_id=sales_info_seq.NEXTVAL;
    /*
    20개 행 이(가) 업데이트되었습니다.
    */

-- SALES_INFO 테이블을 조회합니다.
SELECT * FROM sales_info;



-- 주 수별, 사원별 실적을 조회합니다.
SELECT week_id, employee_id, SUM(sales)
FROM sales_info
GROUP BY ROLLUP (week_id, employee_id);



-- 복구합니다.
ROLLBACK;
    /*
    롤백 완료.
    */    

반응형