๐Ÿงฑ SQL

GROUP BY์™€ ์ง‘๊ณ„ํ•จ์ˆ˜์˜ ์กฐ๊ฑด๋ฌธ์„ ์ด์šฉํ•œ ํ”ผ๋ด‡ํŒ…(Pivoting)

ํ–‰ํŒฝ 2023. 12. 30. 18:02

 

0๏ธโƒฃ ๋“ค์–ด๊ฐ€๋ฉฐ

MySQL์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ GROUP BY์™€ ์ง‘๊ณ„ํ•จ์ˆ˜์˜ CASE WHEN์„ ์ด์šฉํ•œ ํ”ผ๋ด‡ํŒ…(Pivoting)์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฑธ ๋ฐฐ์› ๋‹ค. ํ”ผ๋ด‡ํŒ…์˜ 'ํ”ผ๋ด‡(Pivot)'์€ ์—‘์…€์˜ 'ํ”ผ๋ด‡ ํ…Œ์ด๋ธ”(Pivot Table)'์˜ ๊ทธ ํ”ผ๋ด‡์ด ๋งž๋‹ค.

์—‘์…€์ด๋‚˜ ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์‚ฌ๋žŒ ์ค‘ ํ”ผ๋ด‡ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ด๋ณด์ง€ ์•Š์€ ์‚ฌ๋žŒ์€ ๋“œ๋ฌผ ๊ฒƒ ๊ฐ™๋‹ค. ๋‚˜ ์—ญ์‹œ ํšŒ์‚ฌ๋ฅผ ๋‹ค๋‹ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์•ฝํ•˜๊ฑฐ๋‚˜ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ”ผ๋ด‡ ํ…Œ์ด๋ธ” ๊ธฐ๋Šฅ์„ ์ฆ๊ฒจ ์ผ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹จ ํ•œ ๋ฒˆ๋„ 'ํ”ผ๋ด‡'์ด ๋ฌด์Šจ ๋œป์ธ์ง€ ๊ถ๊ธˆํ•ดํ•œ ์ ์ด ์—†๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.

 

๊ทธ๋ž˜์„œ ์ฐพ์•„๋ดค๋‹ค. ํ”ผ๋ด‡์€ ๋ฌด์Šจ ๋œป์ผ๊นŒ?

 

 

 

1๏ธโƒฃ ํ”ผ๋ด‡(Pivot)์ด๋ž€?

'pivot'์˜ ์‚ฌ์ „์  ์ •์˜๋Š” ๋‹ค์Œ๊ณผ๊ฐ™๋‹ค.

โ“’๋„ค์ด๋ฒ„ ์˜์–ด์‚ฌ์ „

 

์š”์ปจ๋Œ€ '์ถ•' ํ˜น์€ '์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ ํšŒ์ „ํ•˜๋‹ค'๋Š” ๋œป์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ”ผ๋ด‡ ํ…Œ์ด๋ธ”์˜ ๋œป์€ '์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํšŒ์ „(์ด๋™/๋ณ€๊ฒฝ)์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํ…Œ์ด๋ธ”'์ด๋ผ๊ณ  ๋ณด๋ฉด ๋˜๊ฒ ๋‹ค. ๋” ์š”์•ฝํ•˜์ž๋ฉด '์žฌ์ •๋ ฌํ•œ ํ‘œ'๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜ ๊ธฐ์ˆ ํ•  'ํ”ผ๋ด‡ํŒ…'์€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ '์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™/๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ์ž‘์—…(์ผ๋ จ์˜ ๊ณผ์ •)' ์ •๋„๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

ํ”ผ๋ด‡, ํ”ผ๋ด‡ํŒ…์˜ ๊ฐœ๋…์„ ํ™•์‹คํžˆ ์•Œ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ ์—‘์…€ ๋ง๊ณ  SQL ์ฟผ๋ฆฌ๋กœ ์–ด๋–ป๊ฒŒ ํ”ผ๋ด‡ํŒ…ํ•˜์—ฌ ํ”ผ๋ด‡ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

 

 

 

2๏ธโƒฃ ์‚ฌ์ „ ์ง€์‹ - GROUP BY ์ ˆ๊ณผ ์ง‘๊ณ„ํ•จ์ˆ˜(Aggregate Function)

โœ… GROUP BY

  • GROUP BY ์ ˆ์€ ํ•ด๋‹น ์ ˆ์— ๊ธฐ์ˆ ํ•œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์œผ๋กœ ๊ทธ๋ฃนํ™”(Grouping)๋ฅผ ํ•ด ์ค€๋‹ค.
  • ์ง‘๊ณ„ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ๊ทธ๋ฃนํ™”๋œ ์ง‘๊ณ„ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
  • having ์ ˆ์„ ์ด์šฉํ•˜์—ฌ ๊ทธ๋ฃนํ™”ํ•œ ๊ฒฐ๊ณผ์— ์กฐ๊ฑด์„ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค.
-- ์ฐธ๊ณ  : SQL์€ From > Where > Group by > Having > Select > Order by ์ˆœ์œผ๋กœ ์‹คํ–‰

-- ๊ตฌ์กฐ
SELECT ์ปฌ๋Ÿผ
FROM ํ…Œ์ด๋ธ”
WHERE ์กฐ๊ฑด
GROUP BY ์ ์šฉํ•  ์ปฌ๋Ÿผ
HAVING ๊ทธ๋ฃนํ™” ๊ฒฐ๊ณผ์˜ ํ•„ํ„ฐ๋ง ์กฐ๊ฑด
ORDER BY ์ปฌ๋Ÿผ

-- ์˜ˆ์‹œ (ํ•˜๋‹จ ์ด๋ฏธ์ง€)
SELECT genre, avg(price) as avg_price
FROM book_list
GROUP BY genre

โ“’learnsql.com/blog/group-by-in-sql-explained/

 

โœ… ์ง‘๊ณ„ํ•จ์ˆ˜

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ–‰, ํ˜น์€ ํ…Œ์ด๋ธ” ์ „์ฒด ํ–‰์„ ์ž…๋ ฅ๋ฐ›์•„ ํ•˜๋‚˜์˜ ์ถœ๋ ฅ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • SUM()์„ ์ œ์™ธํ•˜๊ณ , NULL์„ ์ง‘๊ณ„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

โ“’learnsql.com/blog/sql-aggregate-functions/

 

 

 

3๏ธโƒฃ ํ”ผ๋ด‡ํŒ…(Pivoting)

์•ž์„œ ํ”ผ๋ด‡ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ํ”ผ๋ด‡ํŒ…์ด๋ผ๊ณ  ํ–ˆ๋‹ค. SQL๋กœ ํ”ผ๋ด‡ํŒ…์„ ํ•˜๋ ค๋ฉด GROUP BY์™€ ์ง‘๊ณ„ํ•จ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ์ง‘๊ณ„ํ•จ์ˆ˜์— ์ ์šฉํ•  ์กฐ๊ฑด๋ฌธ CASE WHEN์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

๊ฐ€๋ น ์•„๋ž˜์™€ ๊ฐ™์ด transactions ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ํ•ด ๋ณด์ž.

 

โ“’learnsql.com/blog/useful-sql-patterns-pivoting/

 

์ด ํ…Œ์ด๋ธ”์„ ํ”ผ๋ด‡ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

SELECT customer,
    SUM(CASE WHEN type = 'type_1' THEN amount ELSE 0 END) AS sum_type_1,
    SUM(CASE WHEN type = 'type_2' THEN amount ELSE 0 END) AS sum_type_2,
    SUM(CASE WHEN type = 'type_3' THEN amount ELSE 0 END) AS sum_type_3
FROM transactions
GROUP BY customer
ORDER BY customer;

 

์ปฌ๋Ÿผ์€ customer, sum_type_1, sum_type_2, sum_type_3 ์ด 4๊ฐœ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ’์ด ๊ฒฐ๊ณผ๊ฐ’์ด ๋œ๋‹ค.

 

โ“’learnsql.com/blog/useful-sql-patterns-pivoting/

 

์ฆ‰ ๊ณ ๊ฐ๋ณ„ ํƒ€์ž…๋ณ„ ์ฃผ๋ฌธํ•ฉ๊ณ„๋ฅผ ํ”ผ๋ด‡ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.

 

 

 

4๏ธโƒฃ ๋‚˜๊ฐ€๋ฉฐ

์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ์ง€์— ๋”ฐ๋ผ ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉํ•˜์—ฌ ํ”ผ๋ด‡ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ ๋‹ค๋ฉด ์—‘์…€์— ๋ถ™์—ฌ ๋„ฃ๊ณ  'ํ”ผ๋ด‡ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ' ๊ธฐ๋Šฅ์„ ํด๋ฆญํ•˜๋ฉด ๋๋‚  ์ผ์ด์ง€๋งŒ, ์•ž์œผ๋กœ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋А ์ •๋„ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ์ง€ ๋ชจ๋ฅด๋‹ˆ ๊ผญ ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ฉฐ ๊ณต๋ถ€ํ•˜์ž.