SQL) PIVOT / UNPIVOT

jinsungยท2025๋…„ 11์›” 3์ผ

SQL

๋ชฉ๋ก ๋ณด๊ธฐ
5/46

๐Ÿ˜Ž PIVOT / UNPIVOT ์ด๋ž€?

  • ํ–‰๊ณผ ์—ด์„ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค
  • PIVOT ์€ ์„ธ๋กœ๋กœ ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋กœ ํ˜•ํƒœ๋กœ ์ง‘๊ณ„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ , UNPIVOT ์€ ๊ฐ€๋กœ๋กœ ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„ธ๋กœ ํ˜•ํƒœ๋กœ ๋ณดํ†ต PIVOT ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ ํ•˜๋ ค ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค

โ— ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ

1) LONG DATA (Tidy data)

  • ํ•˜๋‚˜์˜ ์†์„ฑ์ด ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ •์˜๋˜์–ด ๊ฐ’๋“ค์ด ์—ฌ๋Ÿฌ ํ–‰์œผ๋กœ ์Œ“์ด๋Š” ๊ตฌ์กฐ
  • RDBMS ํ…Œ์ด๋ธ” ์„ค๊ณ„ ๋ฐฉ์‹
  • ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ์˜ ์กฐ์ธ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ
์ด๋ฆ„๊ณผ๋ชฉ์ ์ˆ˜
์ง€์œค์ˆ˜ํ•™95
๋ฏธํ˜œ์ผ๋ณธ์–ด50
์€์ œ์ค‘๊ตญ์–ด90
์ธ์ˆ˜์ฒด์œก80
๋ฏธ์ง„์˜์–ด75
๋ฏผ์„ฑ์ˆ˜ํ•™58
์ง€์œค์ฒด์œก100
๋ฏผ์„ฑ์ผ๋ณธ์–ด100

2) WIDE DATA (Cross table)

  • ํ–‰๊ณผ ์ปฌ๋Ÿผ์— ์œ ์˜๋ฏธํ•œ ์ •๋ณด ์ „๋‹ฌ์„ ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ต์ฐจํ‘œ
  • ํ•˜๋‚˜์˜ ์†์„ฑ๊ฐ’์ด ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ํ‘œํ˜„
  • RDBMS์—์„œ ๋น„ํšจ์œจ์ 
  • ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ์˜ ์กฐ์ธ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€ํ•˜๊ณ  ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์•ฝํ•  ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ
์ด๋ฆ„์ˆ˜ํ•™์ผ๋ณธ์–ด์ค‘๊ตญ์–ด์ฒด์œก์˜์–ด
์ง€์œค95100
๋ฏธํ˜œ50
์€์ œ90
๋ฏธ์ง„75
์ธ์ˆ˜80
๋ฏผ์„ฑ58100

โ— ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€๊ฒฝ

1) PIVOT : LONG DATA -> WIDE DATA
2) UNPIVOT : WIDE DATA -> LONG DATA

โ— PIVOT

  • ๊ต์ฐจํ‘œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ (LONG DATA -> WIDE DATA)
  • STACK COLUMN, UNSTACK COLUMN, VALUE COLUMN ์˜ ์ •์˜๊ฐ€ ์ค‘์š”
  • FROM์ ˆ์— STACK, UNSTACK, VALUE ์ปฌ๋Ÿผ๋ช…๋งŒ ์ •์˜ ํ•„์š” (์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉํ•ด ํ•„์š” ์ปฌ๋Ÿผ ์ œํ•œ)
  • PIVOT์ ˆ -> UNSTACK, VALUE ์ปฌ๋Ÿผ๋ช… ์ •์˜
  • PIVOT์ ˆ IN ์—ฐ์‚ฐ์ž -> UNSTACK ์ปฌ๋Ÿผ ๊ฐ’์„ ์ •์˜
  • FROM์ ˆ์— ์„ ์–ธ๋œ ์ปฌ๋Ÿผ ์ค‘ PIVOT์ ˆ์—์„œ ์„ ์–ธํ•œ VALUE์ปฌ๋Ÿผ, UNSTACK์ปฌ๋Ÿผ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์ปฌ๋Ÿผ์€ STACK ์ปฌ๋Ÿผ์ด ๋จ

โ— UNPIVOT

  • WIDE ๋ฐ์ดํ„ฐ๋ฅผ LONG ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฌธ๋ฒ•
  • STACK ์ปฌ๋Ÿผ : ์ด๋ฏธ UNSTACK ๋˜์–ด ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์„ ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์œผ๋กœ STACK ์‹œ ์ƒˆ๋กœ ๋งŒ๋“ค ์ปฌ๋Ÿผ ์ด๋ฆ„ (์‚ฌ์šฉ์ž ์ •์˜)
  • VALUE ์ปฌ๋Ÿผ : ๊ต์ฐจํ‘œ์—์„œ ์…€ ์ž๋ฆฌ๊ฐ’์„ ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•  ๋•Œ ์ƒˆ๋กœ ๋งŒ๋“ค ์ปฌ๋Ÿผ๋ช…
    (์‚ฌ์šฉ์ž ์ •์˜)

๐Ÿ˜ด ์˜ˆ์ œ ๋ฐ์ดํ„ฐ๋กœ pivot/unpivot ์—ฐ์Šตํ•ด๋ณด๊ธฐ

  • ์ž„์˜๋กœ ๋งŒ๋“  ํ…Œ์ด๋ธ”

  • DATA PIVOT

    ์˜ˆ์‹œ 1) ์ง๊ธ‰๋ณ„ ์ข‹์•„ํ•˜๋Š” ๋ฒ„๊ฑฐ ์ธ์› ์ง‘๊ณ„

SELECT *
FROM (
    SELECT EMP_ID, JOB_TITLE, BURGER_NAME
    FROM MCDONALDS
)
PIVOT (
    COUNT(EMP_ID)
    FOR JOB_TITLE IN ('์ ์žฅ' AS ์ ์žฅ,
                      '๋งค๋‹ˆ์ €' AS ๋งค๋‹ˆ์ €,
                      'ํŒ€๋ฆฌ๋”' AS ํŒ€๋ฆฌ๋”,
                      '๊ทธ๋ฆด' AS ๊ทธ๋ฆด,
                      '์นด์šดํ„ฐ' AS ์นด์šดํ„ฐ)
);

์˜ˆ์‹œ 2) ๋น…๋งฅ, ์ƒํ•˜์ด, ๋ฒ ํ† ๋”” ์ค‘ ์ง๊ธ‰๋ณ„๋กœ ์ข‹์•„ํ•˜๋Š” ๋ฒ„๊ฑฐ ์ธ์› ์ง‘๊ณ„

SELECT *
FROM (
  SELECT EMP_ID, JOB_TITLE, BURGER_NAME
  FROM MCDONALDS
)
PIVOT (
  COUNT(EMP_ID)
  FOR BURGER_NAME IN ('๋น…๋งฅ' AS ๋น…๋งฅ,
                    '๋งฅ์ŠคํŒŒ์ด์‹œ ์ƒํ•˜์ด ๋ฒ„๊ฑฐ' AS ์ƒํ•˜์ด,
                    '๋ฒ ์ด์ปจ ํ† ๋งˆํ†  ๋””๋Ÿญ์Šค' AS ๋ฒ ํ† ๋””)
);

  • DATA UNPIVOT

    • WIDE ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด์„œ ์œ„์— PIVOT์œผ๋กœ ๋งŒ๋“  WIDE ๋ฐ์ดํ„ฐ๋ฅผ LONG ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Œ
    SELECT BURGER_NAME, JOB_TITLE, EMP_COUNT
	FROM (
    	SELECT *
    	FROM (
      	  SELECT EMP_ID, JOB_TITLE, BURGER_NAME
       	 FROM MCDONALDS
  	  )
	    PIVOT (
 	       COUNT(EMP_ID)
	        FOR JOB_TITLE IN ('์ ์žฅ' AS ์ ์žฅ,
	                          '๋งค๋‹ˆ์ €' AS ๋งค๋‹ˆ์ €,
 	                         'ํŒ€๋ฆฌ๋”' AS ํŒ€๋ฆฌ๋”,
 	                         '๊ทธ๋ฆด' AS ๊ทธ๋ฆด,
 	                         '์นด์šดํ„ฐ' AS ์นด์šดํ„ฐ)
	    )
	)  
	UNPIVOT (
	    EMP_COUNT FOR JOB_TITLE IN (์ ์žฅ, ๋งค๋‹ˆ์ €, ํŒ€๋ฆฌ๋”, ๊ทธ๋ฆด, ์นด์šดํ„ฐ)
	)
	ORDER BY BURGER_NAME, JOB_TITLE;

์ด๋ ‡๊ฒŒ ๋ฒ„๊ฑฐ๋งˆ๋‹ค ๊ฐ ์ง๊ธ‰๋ณ„๋กœ ๋‹ค์‹œ LONG DATA๋กœ ๋ณ€ํ™˜ ์‹œ์ผœ์ค€ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Œ. 100ํ–‰์ด ๋„˜๊ฒŒ๋‚˜์™€์„œ ์งœ๋ฆ„. ์ผ๋ฐ˜์ ์œผ๋กœ ์ง‘๊ณ„ํ•  ๋•Œ๋Š” PIVOT ์“ฐ๋Š” ๊ฒŒ ์ข‹๊ณ  PIVOT์œผ๋กœ ์—ด๋กœ ๋ฐ”๊พผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ถ„์„ํ•  ๋•Œ UNPIVOT ์“ฐ๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์Œ

profile
Data Engineer

0๊ฐœ์˜ ๋Œ“๊ธ€