[MYSQL] ๐ WITH ROLLUP & Grouping ํจ์
WITH ROLLUP
RollUp์ ๊ทธ๋ฃน ํญ๋ชฉ ์ดํฉ(์ด๊ณ)์ด๋, ๊ฐ ๊ทธ๋ฃน ๋ณ ์ค๊ฐํฉ๊ณ(์๊ณ)๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค.
์๋ฅผ๋ค์ด ๊ทธ๋ฅ โGROUP BY๋ฅผ ์ฌ์ฉํ๋ฉด GROUP BY ๋ค์ ๋์ค๋ ์ปฌ๋ผ๋ณ๋ก ํฉ๊ณ๋ฅผ ๊ตฌํด์ค๋ค.
์ด๋, ์์ฌ์ด ์ ์ด ์๋ค๋ฉด ํญ๋ชฉ๋ณ ํฉ๊ณ์ ์ ์ฒด ํฉ๊ณ๊ฐ ๊ฐ์ด ๋์ค๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ด๋ด ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด WITH ROLLUP ์ด๋ค.
WITH ROLLUP๋ ๊ทธ๋ฃน๋ณ๋ก ํฉ๊ณ๋ฅผ ํ๋ฒ์ ๊ตฌํ ๋ ์ฌ์ฉํ๋ค.
์ด๋ ํฉ๊ณ๊ฐ๋ง ์ถ๊ฐํ๋๊ฑฐ๋ผ, ๋๋จธ์ง ํ๋ ์ด๋ฆ ์๋ฆฌ์๋ ๋น์ฐํ NULL๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋๋ฐ, ์ฟผ๋ฆฌ๋ฅผ ํตํด์ ์ด๋ฆ์ ๋ช ๋ช ํด์ค์ ์๋ค.
โ
์น ์๋ฒ๋จ์์ ์ฌ์ฉํ ์ฟผ๋ฆฌ์๋ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋๋ง ์ฌ์ฉ๋๋ค.
์๋ฒ๋จ์์ ๋์ผํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, GROUP BY๋ก ์กฐํํด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ค.
ROLLUP ์์
์ ์ฒด ์ด๊ณ
[ store_information ํ ์ด๋ธ ]
region_name | store_name | sales |
West | Los Angeles | 1500 |
West | San Diego | 250 |
West | Los Angeles | 300 |
East | Boston | 700 |
SELECT store_name, SUM(sales)
FROM store_information
GROUP BY store_name WITH ROLLUP
โstore_name | SUM(sales) |
Boston | 700 |
Los Angeles | 1800 |
San Diego | 250 |
NULL | 2750 |
โ* ๊ทธ๋ฃน ์ดํฉ : ๋ง์ง๋ง ์ด์ ํฉ๊ณ๊ฐ 2750์ด ํ์๋๊ณ ์๋ค.
๋ถ๋ถ ์๊ณ
SELECT region_name, store_name, SUM(sales)
FROM store_information
GROUP BY region_name, store_name WITH โROLLUP
์ด๋ฒ์๋ select ํ๋๋ฅผ ๋๊ฐ์ง๋ก ํ๋ค.
๊ทธ๋ฌ๋ฉด ๋๋ฒ ์งธ ํ๋ ์ข ๋ฅ์ ๋ฐ๋ผ ์ค๊ฐ ์๊ณ๊ฐ ๋์ค๊ฒ ๋๋ค.
[ ๊ฐ ๊ทธ๋ฃน๋ณ ์ค๊ฐ์ดํฉ ]
region_name | store_name | SUM(sales) |
East | Boston | 700 |
East | NULL | 700 |
West | Los Angeles | 1800 |
West | San Diego | 250 |
West | NULL | 2050 |
NULL | NULL | 2750 |
2๋ฒ์งธ ์ด์ East์ ํฉ๊ณ๊ฐ 700์ด๊ณ , 4๋ฒ์งธ ์ด์ West์ ํฉ๊ณ๊ฐ 2050์ด ํ์๋๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ , 5์ด์ ์ด ๋ชจ๋ ํฉ๊ณ์ธ 2750์ด ํ์๋๋ค.
Grouping ํจ์
๋ง์ผ null์ ํ์ฉํ๋ ํ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ผ ์ค์ ๋ฐ์ดํฐ๊ฐ NULL ์ด์ด์ NULL ๋ก ์ฐ์ธ ๊ฒ๊ณผ, ๋ถ๋ถ ์๊ณ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ฐ์ธ NULL ์ ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น?
์๋์ ๊ฐ์ ํ ์ด๋ธ์์ region ์ด ์ค์ ๋ฐ์ดํฐ๊ฐ NULL ์ธ๊ฑด์ง ๋ถ๋ถ ์๊ณ NULL ์ธ๊ฑด์ง ๊ตฌ๋ถํ๊ธฐ๋ ์ฌ์ค ์ด๋ ต๋ค.
์ต๊ทผ Mysql 8๋ฒ์ ผ์์๋ ์ด ๋์ ๊ตฌ๋ถํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์๋ฅผ ์ง์ํด ์ฃผ์๋ค.
๋ฐ๋ก GROUPING ์ด๋ผ๋ ํจ์๋ค.
GROUPING ํจ์๋ ๊ทธ ์ธ์๋ฅผ ๊ทธ๋ฃจํ ๊ธฐ์ค์์ ๊ณ ๋ คํ์ง ์์ ๋ถ๋ถ ์ด๊ณ์ธ ๊ฒฝ์ฐ์ 1์ ๋ฆฌํดํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 0์ ๋ฆฌํดํ๋ค.
> select * from table;
+------+------+------+
| a | b | c |
+------+------+------+
| 111 | 11 | 11 |
| 222 | 22 | 22 |
| 111 | 12 | 12 |
| 222 | 23 | 23 |
| 1111 | NULL | 112 |
| NULL | 112 | NULL |
+------+------+------+
> SELECT a, b, SUM(c) as SUM, GROUPING(a), GROUPING(b)
FROM table
GROUP BY a,b WITH ROLLUP;
+------+------+------+-------------+-------------+
| a | b | SUM | GROUPING(a) | GROUPING(b) |
+------+------+------+-------------+-------------+
| NULL | 112 | NULL | 0 | 0 |
| NULL | NULL | NULL | 0 | 1 | -- ํ๋b ์๊ณ1
| 111 | 11 | 11 | 0 | 0 |
| 111 | 12 | 12 | 0 | 0 |
| 111 | NULL | 23 | 0 | 1 | -- ํ๋b ์๊ณ2
| 222 | 22 | 22 | 0 | 0 |
| 222 | 23 | 23 | 0 | 0 |
| 222 | NULL | 45 | 0 | 1 | -- ํ๋b ์๊ณ3
| 1111 | NULL | 112 | 0 | 0 |
| 1111 | NULL | 112 | 0 | 1 | -- ํ๋b ์๊ณ4
| NULL | NULL | 180 | 1 | 1 | -- ํ๋a ์ด๊ณ
+------+------+------+-------------+-------------+
GROUPING(a)๋ a์ปฌ๋ผ์ ์ ์ฒด sum ๊ฒฐ๊ณผ๋ฅผ 1๋ก ํ์ํด์ฃผ๋ฉฐ, GROUPING(b)๋ ๊ฐ a์ปฌ๋ผ ๊ทธ๋ฃนํํ c๋ฅผ ํฉํ ๊ฐ์ SUM์ปฌ๋ผ์ ์ถ๋ ฅํด์ฃผ๊ณ 1๋ก ํ์ํด์ค๋ค.