[oracle] PIVOT, UNPIVOT

μž¬ν˜„Β·2024λ…„ 6μ›” 12일
post-thumbnail

πŸ” PIVOT, UNPIVOT

πŸ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ ν˜•μ‹ vs μŠ€ν”„λ ˆλ“œ μ‹œνŠΈ ν˜•μ‹

✍ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ ν˜•μ‹μ€ μ •λ³΄λŠ” λ‹€ λ“€μ–΄κ°€ μž‡μ§€λ§Œ ν•œ λˆˆμ— 보기 μ–΄λ ΅λ‹€. ν•˜μ§€λ§Œ λΆ„μ„ν•˜κΈ° 쉽닀. μŠ€ν”„λ ˆλ“œ μ‹œνŠΈ ν˜•μ‹μ€ ν•œ λˆˆμ— 보기 μ‰½μ§€λ§Œ λΆ„μ„ν•˜κΈ° μ–΄λ ΅λ‹€. κ·Έλž˜μ„œ 이것을 μ„œλ‘œ 상황에 따라 ν˜•μ‹μ„ λ°”κΏ”μ£ΌλŠ” 것이 PIVOT(κ΄€κ³„ν˜•μ„ μŠ€ν”„λ ˆλ“œ ν˜•μ‹μœΌλ‘œ), UNPIVOT(μŠ€ν”„λ ˆλ“œ ν˜•μ‹μ„ κ΄€κ³„ν˜•μœΌλ‘œ)이닀.

✍ PIVOTκ³Ό UNPIVOT을 μ‰½κ²Œ μ„€λͺ…ν•˜κΈ° μœ„ν•΄μ„œ ν–‰ λ‹¨μœ„λ‘œ μ €μž₯된 ν…Œμ΄ν„°κ°€ μžˆλŠ” ν…Œμ΄λΈ”κ³Ό μ—΄ λ‹¨μœ„κ°€ μ €μž₯된 데이터가 μžˆλŠ” ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜κ² λ‹€.

-- ν–‰ λ‹¨μœ„λ‘œ μ €μž₯된 ν…Œμ΄λΈ” 생성
CREATE TABLE SALES_DATA(
    EMPLOYEE_ID NUMBER(6),
    WEEK_ID NUMBER(2),
    WEEK_DAY VARCHAR2(10),
    SALES NUMBER(8,2)
);

-- 데이터 μ‚½μž…
INSERT INTO SALES_DATA values(1101, 4, 'SALES_MON', 100);
INSERT INTO SALES_DATA values(1101, 4, 'SALES_TUE', 150);
INSERT INTO SALES_DATA values(1101, 4, 'SALES_WED', 80);
INSERT INTO SALES_DATA values(1101, 4, 'SALES_THU', 60);
INSERT INTO SALES_DATA values(1101, 4, 'SALES_FRI', 120);
INSERT INTO SALES_DATA values(1102, 5, 'SALES_MON', 300);
INSERT INTO SALES_DATA values(1102, 5, 'SALES_TUE', 300);
INSERT INTO SALES_DATA values(1102, 5, 'SALES_WED', 230);
INSERT INTO SALES_DATA values(1102, 5, 'SALES_THU', 120);
INSERT INTO SALES_DATA values(1102, 5, 'SALES_FRI', 150);
COMMIT;

select * from SALES_DATA;

-- μ—΄ λ‹¨μœ„λ‘œ μ €μž₯된 ν…Œμ΄λΈ” 생성
CREATE TABLE SALES(
    EMPLOYEE_ID NUMBER(6),
    WEEK_ID NUMBER(2),
    SALES_MON NUMBER(8,2),
    SALES_TUE NUMBER(8,2),
    SALES_WED NUMBER(8,2),
    SALES_THU NUMBER(8,2),
    SALES_FRI NUMBER(8,2)
);

-- 데이터 μ‚½μž…
INSERT INTO SALES VALUES(1101, 4, 100, 150, 80, 60, 120);
INSERT INTO SALES VALUES(1102, 5, 300, 300, 230, 120, 150);

COMMIT;

πŸ” PIVOT

-- PIVOT = ν–‰ ν…Œμ΄λΈ”μ„ μ—΄ ν…Œμ΄λΈ”λ‘œ(κ΄€κ³„ν˜• ν…Œμ΄λΈ”μ— λŒ€ν•œ ν¬λ‘œμŠ€νƒ­ ν…Œμ΄λΈ”λ‘œ)
-- SALES_DATA ν…Œμ΄λΈ”μ˜ WEEK_DAY 컬럼의 VALUEλŠ” μ›”μš”μΌλΆ€ν„° κΈˆμš”μΌκΉŒμ§€ 컬럼으둜 λ‚˜λˆ μ§„λ‹€.
-- SALES_DATA ν…Œμ΄λΈ”μ˜ SALESλŠ” SUMν•¨μˆ˜λ‘œ 인해 각 μš”μΌ 컬럼의 VALUE둜 ν•©ν•˜μ—¬ λ“€μ–΄κ°„λ‹€.
SELECT *
FROM SALES_DATA
pivot
(
    SUM(SALES)
    for WEEK_DAY IN ('SALES_MON' AS SALES_MON,
                     'SALES_TUE' AS SALES_TUE,
                     'SALES_WED' AS SALES_WED,
                     'SALES_THU' AS SALES_THU,
                     'SALES_FRI' AS SALES_FRI)
)
ORDER BY EMPLOYEE_ID, WEEK_ID;

πŸ” UNPIVOT

-- UNPIVOT = μ—΄ ν…Œμ΄λΈ”μ„ ν–‰ ν…Œμ΄λΈ”λ‘œ(ν¬λ‘œμŠ€νƒ­ ν…Œμ΄λΈ”μ„ κ΄€κ³„ν˜• ν…Œμ΄λΈ”λ‘œ)
-- SALES ν…Œμ΄λΈ”μ˜ 각 μš”μΌ 컬럼이 WEEK_DAY μ»¬λŸΌμ•ˆμ— VALUE둜 λ“€μ–΄κ°€κ²Œ λœλ‹€.
-- SALES ν…Œμ΄λΈ”μ˜ WEEK_DAY 컬럼 μ•ˆμ— λ“€μ–΄κ°„ μš”μΌ 별 SALES의 값을 각각 λ‚˜λˆ μ„œ 좜λ ₯ν•œλ‹€
SELECT EMPLOYEE_ID, WEEK_ID, WEEK_DAY, SALES
FROM SALES
UNPIVOT
(
    SALES
    FOR WEEK_DAY
    IN (SALES_MON, SALES_TUE, SALES_WED, SALES_THU, SALES_FRI)
);

πŸ“– reference

μΈν”„λŸ° 였라클 λ°μ΄ν„°λ² μ΄μŠ€ κ°•μ˜

profile
μš΄λ™κ³Ό μ½”λ”©

0개의 λŒ“κΈ€