๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT์ž๊ฒฉ์ฆ ๊ณต๋ถ€/SQLD ์ด๋ก 

[SQLD] PIVOT, UNPIVOT ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (+๊ธฐ์ถœ์˜ˆ์ƒ๋ฌธ์ œ)

by yunamom 2025. 7. 24.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” yunamom ์ž…๋‹ˆ๋‹ค. ^^

์˜ค๋Š˜์€ 2024๋…„ ๋ถ€ํ„ฐ SQLD ์‹œํ—˜ 2๊ณผ๋ชฉ SQL ํ™œ์šฉ ์— ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๋ฌธ์ œ์œ ํ˜• PIVOT, UNPIVOT ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. PIVOT

๋จผ์ € PIVOT ์„ ์ง์—ญํ•˜๋ฉด ์ค‘์‹ฌ์ถ•, ๋˜๋Š” ํšŒ์ „ํ•˜๋‹ค, ๋ฐฉํ–ฅ์„ ์ „ํ™˜ํ•˜๋‹ค ๋ผ๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณดํ†ต PIVOT์„ ์„ค๋ช…ํ•  ๋•Œ "ํ–‰์„ ์—ด๋กœ ์ „ํ™˜ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค" ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด.. ์–ด๋””๊ฐ€ ์ค‘์‹ฌ์ด๊ณ , ์–ด๋–ป๊ฒŒ ํšŒ์ „ํ•˜๋Š” ๊ฑธ๊นŒ์š”? ํ–‰๊ณผ ์—ด, ์ฆ‰ ๊ฐ€๋กœ์™€ ์„ธ๋กœ๋Š” ์–ด๋–ค ๊ฑธ ์˜๋ฏธํ• ๊นŒ์š”?

์—ฌ๊ธฐ์„œ ๋จผ์ € ์•Œ์•„์•ผ ํ• ๊ฒƒ์€ -> ํ–‰(Row) = ๊ฐ€๋กœ, ์—ด(Column) = ์„ธ๋กœ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด์ƒํ•˜์ฃ ? "ํ–‰์„ ์—ด๋กœ ๋ฐ”๊พผ๋‹ค" ๋ฉด์„œ ์™œ ๊ฒฐ๊ณผ๋Š” ๊ฐ€๋กœ๋กœ ํŽผ์ณ์งˆ๊นŒ์š”?

์ฒ˜์Œ ์ ‘ํ•˜๋ฉด ์ •๋ง ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. (์ œ๊ฐ€ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค. ใ…Žใ…Ž)

์ด์ œ PIVOT ์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•๊ณผ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ ์ฒœ์ฒœํžˆ ์ดํ•ดํ•ด๋ด…์‹œ๋‹ค.

 

PIVOT ๊ธฐ๋ณธ ๋ฌธ๋ฒ• (์˜ค๋ผํด)

SELECT ์ปฌ๋Ÿผ๋ชฉ๋ก
FROM (
    SELECT ์›๋ณธ์ปฌ๋Ÿผ๋“ค
    FROM ํ…Œ์ด๋ธ”๋ช…
)
PIVOT (
    ์ง‘๊ณ„ํ•จ์ˆ˜(๊ฐ’์ปฌ๋Ÿผ)
    FOR ๊ธฐ์ค€์ปฌ๋Ÿผ IN (
        '๊ฐ’1' AS ์ƒˆ์ปฌ๋Ÿผ1,
        '๊ฐ’2' AS ์ƒˆ์ปฌ๋Ÿผ2,
        ...
    )
);

- ์ง‘๊ณ„ํ•จ์ˆ˜: ๋ณดํ†ต SUM, MAX, COUNT ๋“ฑ์„ ์‚ฌ์šฉ (*ํ•„์ˆ˜)

- ๊ฐ’์ปฌ๋Ÿผ: ์‹ค์ œ๋กœ ์ง‘๊ณ„ํ•  ์ˆซ์ž๋‚˜ ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ

- ๊ธฐ์ค€์ปฌ๋Ÿผ: ํ”ผ๋ฒ— ๊ธฐ์ค€์ด ๋˜๋Š” ์—ด (์˜ˆ: ๋‚ ์งœ, ์นดํ…Œ๊ณ ๋ฆฌ ๋“ฑ)

- IN์ ˆ: ์–ด๋–ค ๊ฐ’๋“ค์„ ์ƒˆ๋กœ์šด ์—ด๋กœ ๋ฐ”๊ฟ€์ง€ ์ง€์ • '๊ฐ’' AS ์ƒˆ์ปฌ๋Ÿผ์ด๋ฆ„ ํ˜•์‹

 

PIVOT ์˜ˆ์ œ

SELECT *
FROM (
    SELECT ํ’ˆ๋ชฉ, ๋‚ ์งœ, ๊ฐ€๊ฒฉ
    FROM ๊ณผ์ผ_ํŒ๋งค
)
PIVOT (
    MAX(๊ฐ€๊ฒฉ)
    FOR ๋‚ ์งœ IN (
        'Y2025_07' AS "202507",
        'Y2025_08' AS "202508",
        'Y2025_09' AS "202509"
    )
);

- ํ’ˆ๋ชฉ๋ณ„๋กœ ์›”๋ณ„ ์ตœ๊ณ  ๊ฐ€๊ฒฉ(MAX)์„ ๊ฐ€๋กœ ๋ฐฉํ–ฅ์œผ๋กœ

- 'Y2025_07'์ด๋ผ๋Š” ๋‚ ์งœ ๊ฐ’์„ "202507"์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๋ฐ”๊ฟ”์คŒ (์˜ค๋ผํด ์ˆซ์ž ๋ฐ์ดํ„ฐ " " , MS-SQL ์€ [ ] ๋กœ ๊ฐ์‹ธ์ค˜์•ผํ•จ.)

by yunamom

ํ•ด๋‹น ํ‘œ๋ฅผ ๋ณด๋ฉด PIVOT ์ดํ›„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ง๊ด€์ ์ด๊ณ  ๋ณด๊ธฐ ํŽธํ•˜๋‹ค๋Š”๊ฒƒ์„ ๋‹จ๋ฒˆ์— ์•Œ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค ์ˆ˜๋„ ์žˆ์–ด์š”. "์ฒ˜์Œ๋ถ€ํ„ฐ ์ด๋ ‡๊ฒŒ PIVOT ํ˜•ํƒœ๋กœ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋ฉด ๋” ์‰ฝ์ง€ ์•Š์„๊นŒ?"

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” PIVOT ์ „ LONG DATA ์„ค๊ณ„๋ฅผ ํ•˜๊ณ  ์žˆ์ง€์š” ์™œ ๊ทธ๋Ÿด๊นŒ์š”? 

  ๊ตฌ๋ถ„ ์„ค๋ช…
PIVOT ์ „ LONG DATA - **ํ–‰(Row) ์„ ์Œ“์•„์„œ ํ‘œํ˜„
- ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ž˜๋กœ ์ค„์ค„์ด ์Œ“์•„๊ฐ„๋‹ค
- ์ •๊ทœํ™”๋œ ๊ตฌ์กฐ (DB ์นœํ™”์ )
- ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ์˜ JOIN ์—ฐ์‚ฐ ๊ฐ€๋Šฅ
PIVOT ํ›„ WIDE DATA - **์—ด(Column) ์„ ๋‚˜์—ดํ•ด์„œ ํ‘œํ˜„
- ํ•ญ๋ชฉ์„ ์˜†์œผ๋กœ ๋Š˜๋ ค ๊ฐ„๋‹ค. 
- ๋น„์ •๊ทœํ™” ๊ตฌ์กฐ
- JOIN ๋ถˆ๊ฐ€๋Šฅ

 

๊ทธ ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ชฉ์ ์ด '๋ณด๊ธฐ ์ข‹๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ'์ด ์•„๋‹ˆ๋ผ, 'ํšจ์œจ์ ์œผ๋กœ ์ €์žฅ, ์ฒ˜๋ฆฌ, ํ™•์žฅํ•˜๋Š” ๊ฒƒ' ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์— ๋”ฐ๋ผ ์‹œ๊ฐ„์ˆœ์œผ๋กœ ์Œ“์ด๋Š” ๊ฐ’์ด๋‚˜ ๋Œ€๊ทœ๋ชจ ์ธ์›์˜ ์ •๋ณด๋Š” PIVOT์„ ํ™œ์šฉํ•ด ์ผ์‹œ์ ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ์ „ํ™˜ํ•จ์œผ๋กœ์จ, ๋ณด๊ณ ์„œ๋‚˜ ์‹œ๊ฐํ™”์—์„œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํšŒ์‚ฌ ์ง์› ์ •๋ณด๋‚˜ ํ•™์ƒ ์„ฑ์ , ์ œํ’ˆ ํŒ๋งค ๊ธฐ๋ก์ฒ˜๋Ÿผ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๋ˆ„์ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋Œ€๋ถ€๋ถ„ LONG ํ˜•ํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

PIVOT ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ๋ณด๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ด ๊ธธ๊ณ  ๋ณต์žกํ•ด ๋ณด์—ฌ์„œ ์ƒ์†Œํ•˜๊ณ  ๋ถ€๋‹ด์Šค๋Ÿฝ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.PIVOT ์„ ์™œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ์ด ๊ฐœ๋…๋งŒ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋ฉด, PIVOT ๋ฌธ์ œ๋ฅผ ์ ‘ํ•  ๋•Œ ํ›จ์”ฌ ๋” ํŽธํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๐Ÿ˜Š

 

2. UNPIVOT

UNPIVOT ์ด๋ž€ UN + PIVOT = PIVOT ์„ ํ•ด์ œํ•˜๋‹ค. ์ฆ‰, ์—ด(Column) ์„ ํ–‰(Row) ์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

 

UNPIVOT ๊ธฐ๋ณธ ๋ฌธ๋ฒ• (์˜ค๋ผํด)

SELECT ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ...
FROM ํ…Œ์ด๋ธ”๋ช…
UNPIVOT (
    ๊ฐ’์ด๋“ค์–ด๊ฐˆ์ปฌ๋Ÿผ FOR ๊ธฐ์ค€์ปฌ๋Ÿผ IN (๊ธฐ์กด์˜ ์—ด ๋ชฉ๋ก)
);

UNPIVOT ์˜ˆ์ œ

SELECT ํ’ˆ๋ชฉ, ๋‚ ์งœ, ๊ฐ€๊ฒฉ
FROM ๊ณผ์ผ_๊ฐ€๊ฒฉ
UNPIVOT (
    ๊ฐ€๊ฒฉ 
    FOR ๋‚ ์งœ IN (
        Y2025_07, 
        Y2025_08, 
        Y2025_09
    )
);

by yunamom

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ์ƒํ™ฉ์—์„œ UNPIVOT์ด ํ•„์š”ํ• ๊นŒ์š”?

- ์—‘์…€ ๋“ฑ์—์„œ ํ”ผ๋ฒ—๋œ ํ˜•ํƒœ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•  ๋•Œ

- ์‹œ๊ฐํ™”๋‚˜ ๋ณด๊ณ ์šฉ์œผ๋กœ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ SQL ๋ถ„์„์šฉ์œผ๋กœ ๋˜๋Œ๋ฆด ๋•Œ

- ์™ธ๋ถ€ ์‹œ์Šคํ…œ/API์—์„œ WIDE ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒฝ์šฐ 

  ๊ตฌ๋ถ„ ์„ค๋ช…
UNPIVOT ์ „ WIDE DATA - **์—ด(Column)**์„ ๋‚˜์—ดํ•ด์„œ ํ‘œํ˜„
- ํ•ญ๋ชฉ์„ ์˜†→์œผ๋กœ ๋Š˜๋ ค ๊ฐ„๋‹ค
- ๋น„์ •๊ทœํ™” ๊ตฌ์กฐ
- JOIN, ์ง‘๊ณ„, ์กฐ๊ฑด๋ฌธ ์ฒ˜๋ฆฌ์— ๋ถˆ๋ฆฌ
UNPIVOT ํ›„ LONG DATA - **ํ–‰(Row)**์„ ์Œ“์•„์„œ ํ‘œํ˜„
- ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ž˜↓๋กœ ์ค„์ค„์ด ์Œ“์•„๊ฐ„๋‹ค
- ์ •๊ทœํ™”๋œ ๊ตฌ์กฐ (DB ์นœํ™”์ )
- ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ์˜ JOIN ์—ฐ์‚ฐ ๊ฐ€๋Šฅ, SQL ๋ถ„์„์— ์œ ๋ฆฌ

์ฆ‰, PIVOT๋œ ๋ณด๊ธฐ ์ข‹์€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๋ฅผ ๊ฐ€์ ธ์™”์„ ๋•Œ, ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ถ„์„ ๊ฐ€๋Šฅํ•œ ์›๋ž˜ ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด UNPIVOT ์„ ํ•ฉ๋‹ˆ๋‹ค.

3. MS-SQL PIVOT, UNPIVOT

*์˜ค๋ผํด ๊ณผ MS-SQL ์˜ PIVOT ์ฐจ์ด์  ์„ ์•Œ์•„๋ณด๊ธฐ

PIVOT ๊ธฐ๋ณธ ๋ฌธ๋ฒ• (MS-SQL)

SELECT ๊ณ ์ •์ปฌ๋Ÿผ, ๊ฐ’1, ๊ฐ’2, ...
FROM (
    SELECT ๊ณ ์ •์ปฌ๋Ÿผ, ๊ธฐ์ค€์ปฌ๋Ÿผ, ๊ฐ’์ปฌ๋Ÿผ
    FROM ํ…Œ์ด๋ธ”๋ช…
) AS ์†Œ์Šค
PIVOT (
    ์ง‘๊ณ„ํ•จ์ˆ˜(๊ฐ’์ปฌ๋Ÿผ)
    FOR ๊ธฐ์ค€์ปฌ๋Ÿผ IN (๊ฐ’1, ๊ฐ’2, ...)
) AS ๊ฒฐ๊ณผ๋ณ„์นญ;

UNPIVOT ๊ธฐ๋ณธ ๋ฌธ๋ฒ• (MS-SQL)

SELECT ๊ณ ์ •์ปฌ๋Ÿผ, ๊ธฐ์ค€์ปฌ๋Ÿผ, ๊ฐ’์ปฌ๋Ÿผ
FROM (
    SELECT ๊ณ ์ •์ปฌ๋Ÿผ, ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ...
    FROM ํ…Œ์ด๋ธ”๋ช…
) AS ์†Œ์Šค
UNPIVOT (
    ๊ฐ’์ปฌ๋Ÿผ FOR ๊ธฐ์ค€์ปฌ๋Ÿผ IN (์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ...)
) AS ๊ฒฐ๊ณผ๋ณ„์นญ;

 

Oracle vs MS-SQL ๋ฌธ๋ฒ• ์ฐจ์ด์ 

ํ•ญ๋ชฉ ์˜ค๋ผํด MS-SQL
IN ๋‚ด๋ถ€ ๋ณ„์นญ  ๊ฐ€๋Šฅ ('Y2025_07' AS "202507") ๋ถˆ๊ฐ€๋Šฅ (SELECT ์ ˆ์—์„œ AS๋กœ ๋”ฐ๋กœ ์ง€์ •)
์„œ๋ธŒ์ฟผ๋ฆฌ ๋ณ„์นญ ์ƒ๋žต ๊ฐ€๋Šฅ ํ•„์ˆ˜
PIVOT ์ ˆ ๋’ค ๋ณ„์นญ โŒ๋ถˆ๊ฐ€๋Šฅ (์˜ค๋ฅ˜) ํ•„์ˆ˜ 
PIVOT ์ ˆ ์ง‘๊ณ„ํ•จ์ˆ˜ ํ•„์ˆ˜ ํ•„์ˆ˜
์ˆซ์ž ๊ฐ’ ์ปฌ๋Ÿผ๋ช… ํ‘œ๊ธฐ ๋ฐฉ์‹ ํฐ๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ "202507" ๋Œ€๊ด„ํ˜ธ ์‚ฌ์šฉ [202507]

 

์ง‘๊ณ„ ํ•จ์ˆ˜ ์ข…๋ฅ˜ (Oracle & MS-SQL ๊ณตํ†ต)

ํ•จ์ˆ˜๋ช… ์„ค๋ช… ๋ฐ์ดํ„ฐ ํƒ€์ž…
SUM( ) ์ˆซ์ž๋“ค์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐ ์ˆซ์žํ˜•๋งŒ ๊ฐ€๋Šฅ
AVG( ) ํ‰๊ท ๊ฐ’์„ ๊ณ„์‚ฐ ์ˆซ์žํ˜•๋งŒ ๊ฐ€๋Šฅ
MAX( ) ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ ์ˆซ์ž, ๋ฌธ์žํ˜• ๋ชจ๋‘ ๊ฐ€๋Šฅ (๋ฌธ์ž์ผ ๊ฒฝ์šฐ ์‚ฌ์ „์ˆœ ๊ธฐ์ค€)
MIN( ) ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ ์ˆซ์ž, ๋ฌธ์žํ˜• ๋ชจ๋‘ ๊ฐ€๋Šฅ
COUNT( ) ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐ ๋ชจ๋“  ํƒ€์ž… ๊ฐ€๋Šฅ
COUNT(DISTINCT ์ปฌ๋Ÿผ) ์ค‘๋ณต์„ ์ œ์™ธํ•œ ๊ฐ’ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ๋ชจ๋“  ํƒ€์ž… ๊ฐ€๋Šฅ
LISTAGG( ) ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ (*Oracle : GROUP BY ์ „์šฉ) ๋ฌธ์žํ˜• (PIVOT์—๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€)
STRING_AGG( ) ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ (*MS-SQL : GROUP BY ์ „์šฉ) ๋ฌธ์žํ˜• (PIVOT์—๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€)

4. ์˜ˆ์ƒ๋ฌธ์ œ

โ–  ๋ฌธ์ œ1. ๋‹ค์Œ SQL ๋ฌธ์žฅ์—์„œ sal ๊ฐ’์€ ์–ด๋–ค ์—ด๋กœ ์ง‘๊ณ„๋˜๋Š”๊ฐ€?

SELECT *
         FROM (SELECT TO_CHAR (hiredate, 'YYYY') AS yyyy, 
                      job, 
                      deptno, 
                      sal 
                 FROM emp)
        PIVOT (SUM (sal) 
               FOR deptno IN (10, 20, 30))
ORDER BY 1, 2;

 

1) ์ „์ฒด

2) yyyy

3) yyyy. job

4) yyyy. job, deptno

โ–  ๋ฌธ์ œ2. ์•„๋ž˜ S_ENR ํ…Œ์ด๋ธ”์—์„œ ๊ฒฐ๊ณผ(Result) ๋ฅผ ๊ตฌํ•˜๋Š” SQL ๋ฌธ์žฅ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์€? (Oracle)

[S_ENR]
STUDENT_ID   COURSE   SEMESTER
------------------------------
S001          MATH      2025-1
S002          ENGLISH   2025-1
S003          MATH      2025-1
S004          SCIENCE   2025-1
S005          ENGLISH   2025-2
S006          ENGLISH   2025-1
S007          SCIENCE   2025-2

 

[๊ฒฐ๊ณผ]

SEMESTER   MATH    ENGLISH    SCIENCE
--------------------------------------
 2025-1     2         2          1

 

โ‘  
SELECT *
  FROM (
    SELECT COURSE, STUDENT_ID
      FROM S_ENR
     WHERE SEMESTER = '2025-1'
  )
PIVOT (
  COUNT(*) FOR COURSE IN 
    ('MATH' AS MATH, 'ENGLISH' AS ENGLISH, 'SCIENCE' AS SCIENCE)
)
ORDER BY 1;

โ‘ก 
SELECT *
  FROM (
    SELECT SEMESTER, COURSE, STUDENT_ID
      FROM S_ENR
  )
PIVOT (
  COUNT(*) FOR COURSE IN 
    ('MATH' AS MATH, 'ENGLISH' AS ENGLISH, 'SCIENCE' AS SCIENCE)
) AS P;

โ‘ข 
SELECT *
  FROM (
    SELECT SEMESTER, COURSE,
      FROM S_ENR
     WHERE SEMESTER = '2025-1'
  )
PIVOT (
  COUNT(*) FOR COURSE IN 
    ("MATH" AS MATH, "ENGLISH" AS ENGLISH, "SCIENCE" AS SCIENCE)
);

โ‘ฃ
SELECT *
  FROM (
    SELECT SEMESTER, COURSE
      FROM S_ENR
     WHERE SEMESTER = '2025-1'
  )
PIVOT (
  COUNT(*) FOR COURSE IN 
    ('MATH' AS MATH, 'ENGLISH' AS ENGLISH, 'SCIENCE' AS SCIENCE)
)
ORDER BY 1;

[์ •๋‹ต]

 

๋ฌธ์ œ 1 :  (3)

ํ•ด์„ค: ์ง‘๊ณ„ ํ•จ์ˆ˜์— ์‚ฌ์šฉํ•œ sal, FOR ์ ˆ์— ์‚ฌ์šฉํ•œ deptno๋ฅผ ์ œ์™ธํ•œ yyyy. job์œผ๋กœ ์ง‘๊ณ„๋œ๋‹ค.

 

๋ฌธ์ œ 2 :  (4)

ํ•ด์„ค:

1๋ฒˆ โŒ STUDENT_ID๋ฅผ ํฌํ•จํ•œ ์ฑ„ PIVOT์„ ์ˆ˜ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—,๊ฒฐ๊ณผ๋Š” ํ•™์ƒ๋ณ„๋กœ ์ˆ˜๊ฐ•ํ•œ ๊ณผ๋ชฉ์ด ๊ฐ€๋กœ๋กœ ๋‚˜์—ด๋˜์–ด ์ถœ๋ ฅ๋จ.
(ํ•™์ƒ 1๋ช…๋‹น 1ํ–‰์”ฉ ์ถœ๋ ฅ๋˜๋ฉฐ, ํ•™๊ธฐ ๊ตฌ๋ถ„์€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Œ)

 

2๋ฒˆ โŒ PIVOT ์ ˆ ๋’ค์— AS ๋ณ„์นญ ์‚ฌ์šฉ → ORA-00933: SQL command not properly ended

 

3๋ฒˆ โŒ IN ์ ˆ์— ์ปฌ๋Ÿผ๋ช…์„ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์Œ → ORA-56901: non-constant expression is not allowed

 

4๋ฒˆ โœ… ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ด.

COURSE๋ฅผ ๊ธฐ์ค€์œผ๋กœ PIVOT์„ ์ ์šฉํ•ด ๊ณผ๋ชฉ๋ช…์ด ์—ด(Column)๋กœ ์ „ํ™˜๋˜์–ด ํ•ด๋‹น ๊ณผ๋ชฉ์„ ์ˆ˜๊ฐ•ํ•œ ํ•™์ƒ ์ˆ˜๊ฐ€ ์ง‘๊ณ„๋˜์–ด ํ‘œ์‹œ
'MATH' AS MATH์ฒ˜๋Ÿผ ๋ณ„์นญ์„ ์ง€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ ์ปฌ๋Ÿผ๋ช…์€ ๋”ฐ์˜ดํ‘œ ์—†์ด ๊น”๋”ํ•˜๊ฒŒ ๋‚˜์˜ด

728x90
300x250

์ฝ”๋“œ