GROUP BY์ ์ง๊ณํจ์์ ์กฐ๊ฑด๋ฌธ์ ์ด์ฉํ ํผ๋ดํ (Pivoting)
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
โ ์ง๊ณํจ์
- ์ฌ๋ฌ ๊ฐ์ ํ, ํน์ ํ ์ด๋ธ ์ ์ฒด ํ์ ์ ๋ ฅ๋ฐ์ ํ๋์ ์ถ๋ ฅ๊ฐ์ ๋ฐํํ๋ ํจ์์ด๋ค.
- SUM()์ ์ ์ธํ๊ณ , NULL์ ์ง๊ณํ์ง ์๋๋ค.
3๏ธโฃ ํผ๋ดํ (Pivoting)
์์ ํผ๋ด ํ ์ด๋ธ์ ๋ง๋๋ ์์ ์ ํผ๋ดํ ์ด๋ผ๊ณ ํ๋ค. SQL๋ก ํผ๋ดํ ์ ํ๋ ค๋ฉด GROUP BY์ ์ง๊ณํจ์, ๊ทธ๋ฆฌ๊ณ ์ง๊ณํจ์์ ์ ์ฉํ ์กฐ๊ฑด๋ฌธ CASE WHEN์ ์ด์ฉํด์ผ ํ๋ค.
๊ฐ๋ น ์๋์ ๊ฐ์ด transactions ํ ์ด๋ธ์ด ์๋ค๊ณ ํด ๋ณด์.
์ด ํ ์ด๋ธ์ ํผ๋ด ํ ์ด๋ธ๋ก ๋ง๋ค๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค.
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๊ฐ๊ฐ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ ๊ฐ์ด ๊ฒฐ๊ณผ๊ฐ์ด ๋๋ค.
์ฆ ๊ณ ๊ฐ๋ณ ํ์ ๋ณ ์ฃผ๋ฌธํฉ๊ณ๋ฅผ ํผ๋ด ํ ์ด๋ธ๋ก ๋ง๋ ๊ฒ์ด๋ค.
4๏ธโฃ ๋๊ฐ๋ฉฐ
์ด๋ค ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง์ ๋ฐ๋ผ ์ง๊ณํจ์๋ฅผ ๋ฌ๋ฆฌ ์ฌ์ฉํ์ฌ ํผ๋ด ํ ์ด๋ธ์ ๋ง๋ค ์ ์๋ค. ๋ฐ์ดํฐ์ ์์ด ์ ๋ค๋ฉด ์์ ์ ๋ถ์ฌ ๋ฃ๊ณ 'ํผ๋ด ํ ์ด๋ธ ๋ง๋ค๊ธฐ' ๊ธฐ๋ฅ์ ํด๋ฆญํ๋ฉด ๋๋ ์ผ์ด์ง๋ง, ์์ผ๋ก ์ด๋ค ์ํฉ์์ ์ด๋ ์ ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ์ง ๋ชจ๋ฅด๋ ๊ผญ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด๋ณด๋ฉฐ ๊ณต๋ถํ์.