์ด ๊ฒ์๋ฌผ์์๋ SQL์์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ๊ทธ๋ฃนํ ๋๊ตฌ(Aggregate Functions)๋ค์ธ ROLL UP, GROUPING, GROUPING SETS, CUBE์ ๋ํด ๊ฐ๋จํ ์ค๋ช ํ๊ณ , ๊ฐ ๊ธฐ๋ฅ์ ๋ํ ์์ ์ฝ๋๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค.๐
1๏ธโฃ ROLLUP : ๊ณ์ธต์ ์๊ณ ์์ฑ
ํจ์ ์ด๋ฆ์ ์๋ฏธ
"Roll up"์ '์ฐจ๊ณก์ฐจ๊ณก ์์์ฌ๋ฆฌ๋ค'๋ผ๋ ๋ป์ ๋๋ค. ๋ฐ์ดํฐ์ ๊ณ์ธต์ ์ง๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ฐ ๋ ๋ฒจ์์ ํฉ๊ณ๋ฅผ ๊ณ์ ๋์ ํ์ฌ ์์์ฌ๋ฆฌ๋ ๊ณผ์ ์ ๋น์ ํฉ๋๋ค.
์ค๋ช
์ฃผ์ด์ง ์ปฌ๋ผ๋ค์ ๋ํด ๊ณ์ธต์ ์ธ ์๊ณ๋ฅผ ์์ฑํฉ๋๋ค. ์ฆ, ๊ฐ์ฅ ์ผ์ชฝ ์ปฌ๋ผ๋ถํฐ ์์ํ์ฌ ๊ฐ ์ปฌ๋ผ์ ๋ํ ์๊ณ๋ฅผ ๊ตฌํ๊ณ , ์ต์ข ์ ์ผ๋ก ๋ชจ๋ ์ปฌ๋ผ์ ๋ํ ์ดํฉ์ ๊ตฌํฉ๋๋ค.
์์ (ํจ์ ์ธ์ 1๊ฐ)
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, SUM(salary) AS total_salary -- ๋ถ์๋ณ ๊ธ์ฌ ํฉ๊ณ ๊ณ์ฐ
FROM employees
GROUP BY ROLLUP(department_id); -- department_id์ ๋ํด ROLLUP ์ ์ฉโจ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | total_salary | ๋น๊ณ |
10 | 15,000 | |
20 | 12,000 | |
NULL | 27,000 | ์ ์ฒด ์ดํฉโจ |
์์ (ํจ์ ์ธ์ 2๊ฐ)
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, job_id, SUM(salary) AS total_salary -- ๋ถ์๋ณ ๋ฐ ์ง๋ฌด๋ณ ๊ธ์ฌ ํฉ๊ณ ๊ณ์ฐ
FROM employees
GROUP BY ROLLUP(department_id, job_id); -- department_id์ job_id์ ๋ํด ROLLUP ์ ์ฉโจ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | job_id | total_salary | ๋น๊ณ |
10 | IT | 11,000 | |
10 | HR | 4,000 | |
10 | NULL | 15,000 | department_id 10์ ์๊ณโจ |
20 | IT | 7,000 | |
20 | HR | 5,000 | |
20 | NULL | 12,000 | department_id 20์ ์๊ณโจ |
NULL | NULL | 27,000 | ์ ์ฒด ์ดํฉ |
* ์ ๊ฒฐ๊ณผ์์ ROLLUP์ ์ฌ์ฉํจ์ผ๋ก์จ ๋ถ์๋ณ, ์ง๋ฌด๋ณ ์ด๊ณ๋ฅผ ํฌํจํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ถ์ถํ ์ ์์ต๋๋ค.
2๏ธโฃ CUBE : ๋ชจ๋ ๊ฐ๋ฅํ ๊ทธ๋ฃนํ ์กฐํฉ์ ์ง๊ณ ๊ณ์ฐ
ํจ์ ์ด๋ฆ์ ์๋ฏธ
"Cube"๋ '์ ์ฒด์ ์ธ ๊ตฌ์กฐ'๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฌ๋ฌ ์ฐจ์์์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๋ ๊ฒ์ ๋น์ ์ ์ผ๋ก ํํํฉ๋๋ค. CUBE๋ ๋ ๊ฐ ์ด์์ ์ด์ ๋ํด ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ์ง๊ณ๋ฅผ ์์ฑํ๋ฏ๋ก, ๋ฐ์ดํฐ๊ฐ ๋ค์ฐจ์์ ์ผ๋ก ๋ณด๊ด๋๋ ์ ์ฒด์ ์ธ ํ์(ํ๋ธ)์ผ๋ก ์์ํ ์ ์์ต๋๋ค. ์ฆ, ์ฌ๋ฌ ์ถ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๊ณ , ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
์ค๋ช
CUBE๋ ROLLUP์ ํ์ฅ๋ ํํ๋ก, ์ฃผ์ด์ง ์ปฌ๋ผ๋ค์ ๋ํ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ์๊ณ๋ฅผ ์์ฑํฉ๋๋ค. ์ฆ, ๊ฐ ์ปฌ๋ผ์ ๋ํ ์๊ณ, ๋ ๊ฐ์ ์ปฌ๋ผ ์กฐํฉ์ ๋ํ ์๊ณ, ์ธ ๊ฐ์ ์ปฌ๋ผ ์กฐํฉ์ ๋ํ ์๊ณ ๋ฑ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
* ํจ์ ์ด๋ฆ์ ์๋ฏธ:
์์ (ํจ์ ์ธ์ 1๊ฐ)
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY CUBE(department_id); -- department_id์ ๋ํด CUBE ์ ์ฉโจ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | total_salary | ๋น๊ณ |
10 | 15,000 | |
20 | 12,000 | |
NULL | 27,000 | ์ ์ฒด ์ดํฉโจ |
* ํจ์ ์ธ์๊ฐ 1๊ฐ์ผ ๋ CUBE์ ROLLUP์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ผํ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ (ํจ์ ์ธ์ 2๊ฐ)
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, job_id, SUM(salary) AS total_salary
FROM employees
GROUP BY CUBE(department_id, job_id); -- department_id์ job_id์ ๋ํด CUBE ์ ์ฉโจ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | job_id | total_salary | ๋น๊ณ |
10 | IT | 11,000 | |
10 | HR | 4,000 | |
10 | NULL | 15,000 | department_id 10์ ์๊ณโจ |
20 | IT | 7,000 | |
20 | HR | 5,000 | |
20 | NULL | 12,000 | department_id 20์ ์๊ณโจ |
NULL | IT | 18,000 | ์ง๋ฌด๋ณ ์ด๊ณโจ |
NULL | HR | 9,000 | ์ง๋ฌด๋ณ ์ด๊ณโจ |
NULL | NULL | 27,000 | ์ ์ฒด ์ดํฉ |
* CUBE๋ ROLLUP๋ณด๋ค ๋ ๋ง์ ๊ทธ๋ฃนํ ์กฐํฉ์ ์ง๊ณ๋ฅผ ํฌํจํ๋ฉฐ, ๊ฐ ์ง๋ฌด๋ณ ์ด๊ณ๋ ํฌํจ๋ฉ๋๋ค.
3๏ธโฃ GROUPING : ๊ทธ๋ฃนํ๋ ํ์ ํน์ฑ ํ์
์ค๋ช
GROUPING ํจ์๋ ๊ฒฐ๊ณผ์์ NULL ๊ฐ์ด ์ค์ ๋ฐ์ดํฐ์ธ์ง, ์๋๋ฉด ๊ทธ๋ฃนํ๋ก ์ธํด ์์ฑ๋ ๊ฒ์ธ์ง๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ง๊ณ์ ์ฌ์ฉ๋ ์ปฌ๋ผ์ด๋ฉด 1, ์๋๋ฉด 0์ ๋ฐํํฉ๋๋ค. ์ด ํจ์๋ ROLLUP์ด๋ CUBE์ ํจ๊ป ์ฌ์ฉ๋์ด, ๋ณด๋ค ๋ช ํํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์์
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT
DECODE(GROUPING(department_id), 1, '<<์ด๊ณ>>', department_id) AS department_id, -- ๋ถ์ ID๊ฐ NULL์ด๋ฉด '<<์ด๊ณ>>'๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋์ department_id ๋ฐํโจ
DECODE(GROUPING(job_id), 1, '<์๊ณ>', job_id) AS job_id, -- ์ง๋ฌด ID๊ฐ NULL์ด๋ฉด '<์๊ณ>'๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋์ job_id ๋ฐํโจ
SUM(salary) AS total_salary
FROM employees
GROUP BY ROLLUP(department_id, job_id); -- department_id์ job_id์ ๋ํด ROLLUP ์ ์ฉํ์ฌ ์๊ณ ๋ฐ ์ด๊ณ๋ฅผ ์์ฑ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | job_id | total_salary | ๋น๊ณ |
10 | IT | 11,000 | |
10 | HR | 4,000 | |
10 | <์๊ณ>โจ | 15,000 | department_id 10์ ์๊ณ |
20 | IT | 7,000 | |
20 | HR | 5,000 | |
20 | <์๊ณ>โจ | 12,000 | department_id 20์ ์๊ณ |
<<์ด๊ณ>>โจ | IT | 18,000 | ์ง๋ฌด๋ณ ์ด๊ณ |
<<์ด๊ณ>>โจ | HR | 9,000 | ์ง๋ฌด๋ณ ์ด๊ณ |
<<์ด๊ณ>>โจ | <์๊ณ>โจ | 27,000 | ์ ์ฒด ์ดํฉ |
* ์ด ๊ฒฐ๊ณผ๋ GROUPING ํจ์๋ฅผ ์ฌ์ฉํด NULL ๊ฐ์ ๋ช ํํ๊ฒ ํ์ํจ์ผ๋ก์จ, ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ด๊ณ์ธ์ง ์ฝ๊ฒ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
4๏ธโฃ GROUPING SETS : ํน์ ๊ทธ๋ฃนํ ์กฐํฉ ์ ์
์ค๋ช
GROUPING SETS๋ ์ฌ์ฉ์๊ฐ ์ํ๋ ์กฐํฉ์ ์๊ณ๋ง์ ์ ํ์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ROLLUP์ด๋ CUBE๊ฐ ์๋์ผ๋ก ์์ฑํ๋ ์ง๊ณ ์กฐํฉ๊ณผ ๋ฌ๋ฆฌ, GROUPING SETS๋ ํน์ ํ ์ง๊ณ ์กฐํฉ๋ง ์ ํ์ ์ผ๋ก ๊ตฌํ ์ ์์ต๋๋ค.
์์
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, job_id, SUM(salary) AS total_salary
FROM employees
GROUP BY GROUPING SETS (
(department_id, job_id), -- ๋ถ์๋ณ ๋ฐ ์ง๋ฌด๋ณ ์ง๊ณ(๊ฒฐ๊ณผ 4ํ)โจ
(department_id), -- ๋ถ์๋ณ ์ง๊ณ(๊ฒฐ๊ณผ 2ํ)โจ
(job_id), -- ์ง๋ฌด๋ณ ์ง๊ณ(๊ฒฐ๊ณผ 2ํ)โจ
() -- ์ ์ฒด ์ง๊ณ(๊ฒฐ๊ณผ 1ํ)โจ
);
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | job_id | total_salary | ๋น๊ณ |
10 | IT | 11,000 | |
10 | HR | 4,000 | |
10 | NULL | 15,000 | department_id 10์ ์๊ณ |
20 | IT | 7,000 | |
20 | HR | 5,000 | |
20 | NULL | 12,000 | department_id 20์ ์๊ณ |
NULL | IT | 18,000 | ์ง๋ฌด๋ณ ์ด๊ณ |
NULL | HR | 9,000 | ์ง๋ฌด๋ณ ์ด๊ณ |
NULL | NULL | 27,000 | ์ ์ฒด ์ดํฉ |
* GROUPING SETS๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ์๋ณ ์ง๊ณ, ์ง๋ฌด๋ณ ์ง๊ณ, ๊ทธ๋ฆฌ๊ณ ์ ์ฒด ์ดํฉ์ ๊ฐ๊ฐ ๋ณ๋๋ก ๊ตฌํ ์ ์์ต๋๋ค. ์ด์ฒ๋ผ GROUPING SETS๋ ๋ฐ์ดํฐ ์์ฝ์ ๋ณด๋ค ์ ์ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค.
'๐ฒDB_SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด ๊ฒ์๋ฌผ์์๋ SQL์์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ๊ทธ๋ฃนํ ๋๊ตฌ(Aggregate Functions)๋ค์ธ ROLL UP, GROUPING, GROUPING SETS, CUBE์ ๋ํด ๊ฐ๋จํ ์ค๋ช ํ๊ณ , ๊ฐ ๊ธฐ๋ฅ์ ๋ํ ์์ ์ฝ๋๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค.๐
1๏ธโฃ ROLLUP : ๊ณ์ธต์ ์๊ณ ์์ฑ
ํจ์ ์ด๋ฆ์ ์๋ฏธ
"Roll up"์ '์ฐจ๊ณก์ฐจ๊ณก ์์์ฌ๋ฆฌ๋ค'๋ผ๋ ๋ป์ ๋๋ค. ๋ฐ์ดํฐ์ ๊ณ์ธต์ ์ง๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ฐ ๋ ๋ฒจ์์ ํฉ๊ณ๋ฅผ ๊ณ์ ๋์ ํ์ฌ ์์์ฌ๋ฆฌ๋ ๊ณผ์ ์ ๋น์ ํฉ๋๋ค.
์ค๋ช
์ฃผ์ด์ง ์ปฌ๋ผ๋ค์ ๋ํด ๊ณ์ธต์ ์ธ ์๊ณ๋ฅผ ์์ฑํฉ๋๋ค. ์ฆ, ๊ฐ์ฅ ์ผ์ชฝ ์ปฌ๋ผ๋ถํฐ ์์ํ์ฌ ๊ฐ ์ปฌ๋ผ์ ๋ํ ์๊ณ๋ฅผ ๊ตฌํ๊ณ , ์ต์ข ์ ์ผ๋ก ๋ชจ๋ ์ปฌ๋ผ์ ๋ํ ์ดํฉ์ ๊ตฌํฉ๋๋ค.
์์ (ํจ์ ์ธ์ 1๊ฐ)
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, SUM(salary) AS total_salary -- ๋ถ์๋ณ ๊ธ์ฌ ํฉ๊ณ ๊ณ์ฐ FROM employees GROUP BY ROLLUP(department_id); -- department_id์ ๋ํด ROLLUP ์ ์ฉโจ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | total_salary | ๋น๊ณ |
10 | 15,000 | |
20 | 12,000 | |
NULL | 27,000 | ์ ์ฒด ์ดํฉโจ |
์์ (ํจ์ ์ธ์ 2๊ฐ)
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, job_id, SUM(salary) AS total_salary -- ๋ถ์๋ณ ๋ฐ ์ง๋ฌด๋ณ ๊ธ์ฌ ํฉ๊ณ ๊ณ์ฐ FROM employees GROUP BY ROLLUP(department_id, job_id); -- department_id์ job_id์ ๋ํด ROLLUP ์ ์ฉโจ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | job_id | total_salary | ๋น๊ณ |
10 | IT | 11,000 | |
10 | HR | 4,000 | |
10 | NULL | 15,000 | department_id 10์ ์๊ณโจ |
20 | IT | 7,000 | |
20 | HR | 5,000 | |
20 | NULL | 12,000 | department_id 20์ ์๊ณโจ |
NULL | NULL | 27,000 | ์ ์ฒด ์ดํฉ |
* ์ ๊ฒฐ๊ณผ์์ ROLLUP์ ์ฌ์ฉํจ์ผ๋ก์จ ๋ถ์๋ณ, ์ง๋ฌด๋ณ ์ด๊ณ๋ฅผ ํฌํจํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ถ์ถํ ์ ์์ต๋๋ค.
2๏ธโฃ CUBE : ๋ชจ๋ ๊ฐ๋ฅํ ๊ทธ๋ฃนํ ์กฐํฉ์ ์ง๊ณ ๊ณ์ฐ
ํจ์ ์ด๋ฆ์ ์๋ฏธ
"Cube"๋ '์ ์ฒด์ ์ธ ๊ตฌ์กฐ'๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฌ๋ฌ ์ฐจ์์์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๋ ๊ฒ์ ๋น์ ์ ์ผ๋ก ํํํฉ๋๋ค. CUBE๋ ๋ ๊ฐ ์ด์์ ์ด์ ๋ํด ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ์ง๊ณ๋ฅผ ์์ฑํ๋ฏ๋ก, ๋ฐ์ดํฐ๊ฐ ๋ค์ฐจ์์ ์ผ๋ก ๋ณด๊ด๋๋ ์ ์ฒด์ ์ธ ํ์(ํ๋ธ)์ผ๋ก ์์ํ ์ ์์ต๋๋ค. ์ฆ, ์ฌ๋ฌ ์ถ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๊ณ , ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
์ค๋ช
CUBE๋ ROLLUP์ ํ์ฅ๋ ํํ๋ก, ์ฃผ์ด์ง ์ปฌ๋ผ๋ค์ ๋ํ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ์๊ณ๋ฅผ ์์ฑํฉ๋๋ค. ์ฆ, ๊ฐ ์ปฌ๋ผ์ ๋ํ ์๊ณ, ๋ ๊ฐ์ ์ปฌ๋ผ ์กฐํฉ์ ๋ํ ์๊ณ, ์ธ ๊ฐ์ ์ปฌ๋ผ ์กฐํฉ์ ๋ํ ์๊ณ ๋ฑ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
* ํจ์ ์ด๋ฆ์ ์๋ฏธ:
์์ (ํจ์ ์ธ์ 1๊ฐ)
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, SUM(salary) AS total_salary FROM employees GROUP BY CUBE(department_id); -- department_id์ ๋ํด CUBE ์ ์ฉโจ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | total_salary | ๋น๊ณ |
10 | 15,000 | |
20 | 12,000 | |
NULL | 27,000 | ์ ์ฒด ์ดํฉโจ |
* ํจ์ ์ธ์๊ฐ 1๊ฐ์ผ ๋ CUBE์ ROLLUP์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ผํ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ (ํจ์ ์ธ์ 2๊ฐ)
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, job_id, SUM(salary) AS total_salary FROM employees GROUP BY CUBE(department_id, job_id); -- department_id์ job_id์ ๋ํด CUBE ์ ์ฉโจ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | job_id | total_salary | ๋น๊ณ |
10 | IT | 11,000 | |
10 | HR | 4,000 | |
10 | NULL | 15,000 | department_id 10์ ์๊ณโจ |
20 | IT | 7,000 | |
20 | HR | 5,000 | |
20 | NULL | 12,000 | department_id 20์ ์๊ณโจ |
NULL | IT | 18,000 | ์ง๋ฌด๋ณ ์ด๊ณโจ |
NULL | HR | 9,000 | ์ง๋ฌด๋ณ ์ด๊ณโจ |
NULL | NULL | 27,000 | ์ ์ฒด ์ดํฉ |
* CUBE๋ ROLLUP๋ณด๋ค ๋ ๋ง์ ๊ทธ๋ฃนํ ์กฐํฉ์ ์ง๊ณ๋ฅผ ํฌํจํ๋ฉฐ, ๊ฐ ์ง๋ฌด๋ณ ์ด๊ณ๋ ํฌํจ๋ฉ๋๋ค.
3๏ธโฃ GROUPING : ๊ทธ๋ฃนํ๋ ํ์ ํน์ฑ ํ์
์ค๋ช
GROUPING ํจ์๋ ๊ฒฐ๊ณผ์์ NULL ๊ฐ์ด ์ค์ ๋ฐ์ดํฐ์ธ์ง, ์๋๋ฉด ๊ทธ๋ฃนํ๋ก ์ธํด ์์ฑ๋ ๊ฒ์ธ์ง๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ง๊ณ์ ์ฌ์ฉ๋ ์ปฌ๋ผ์ด๋ฉด 1, ์๋๋ฉด 0์ ๋ฐํํฉ๋๋ค. ์ด ํจ์๋ ROLLUP์ด๋ CUBE์ ํจ๊ป ์ฌ์ฉ๋์ด, ๋ณด๋ค ๋ช ํํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์์
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT DECODE(GROUPING(department_id), 1, '<<์ด๊ณ>>', department_id) AS department_id, -- ๋ถ์ ID๊ฐ NULL์ด๋ฉด '<<์ด๊ณ>>'๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋์ department_id ๋ฐํโจ DECODE(GROUPING(job_id), 1, '<์๊ณ>', job_id) AS job_id, -- ์ง๋ฌด ID๊ฐ NULL์ด๋ฉด '<์๊ณ>'๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋์ job_id ๋ฐํโจ SUM(salary) AS total_salary FROM employees GROUP BY ROLLUP(department_id, job_id); -- department_id์ job_id์ ๋ํด ROLLUP ์ ์ฉํ์ฌ ์๊ณ ๋ฐ ์ด๊ณ๋ฅผ ์์ฑ
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | job_id | total_salary | ๋น๊ณ |
10 | IT | 11,000 | |
10 | HR | 4,000 | |
10 | <์๊ณ>โจ | 15,000 | department_id 10์ ์๊ณ |
20 | IT | 7,000 | |
20 | HR | 5,000 | |
20 | <์๊ณ>โจ | 12,000 | department_id 20์ ์๊ณ |
<<์ด๊ณ>>โจ | IT | 18,000 | ์ง๋ฌด๋ณ ์ด๊ณ |
<<์ด๊ณ>>โจ | HR | 9,000 | ์ง๋ฌด๋ณ ์ด๊ณ |
<<์ด๊ณ>>โจ | <์๊ณ>โจ | 27,000 | ์ ์ฒด ์ดํฉ |
* ์ด ๊ฒฐ๊ณผ๋ GROUPING ํจ์๋ฅผ ์ฌ์ฉํด NULL ๊ฐ์ ๋ช ํํ๊ฒ ํ์ํจ์ผ๋ก์จ, ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ด๊ณ์ธ์ง ์ฝ๊ฒ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
4๏ธโฃ GROUPING SETS : ํน์ ๊ทธ๋ฃนํ ์กฐํฉ ์ ์
์ค๋ช
GROUPING SETS๋ ์ฌ์ฉ์๊ฐ ์ํ๋ ์กฐํฉ์ ์๊ณ๋ง์ ์ ํ์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ROLLUP์ด๋ CUBE๊ฐ ์๋์ผ๋ก ์์ฑํ๋ ์ง๊ณ ์กฐํฉ๊ณผ ๋ฌ๋ฆฌ, GROUPING SETS๋ ํน์ ํ ์ง๊ณ ์กฐํฉ๋ง ์ ํ์ ์ผ๋ก ๊ตฌํ ์ ์์ต๋๋ค.
์์
โ๏ธ ์ฟผ๋ฆฌ๋ฌธ
SELECT department_id, job_id, SUM(salary) AS total_salary FROM employees GROUP BY GROUPING SETS ( (department_id, job_id), -- ๋ถ์๋ณ ๋ฐ ์ง๋ฌด๋ณ ์ง๊ณ(๊ฒฐ๊ณผ 4ํ)โจ (department_id), -- ๋ถ์๋ณ ์ง๊ณ(๊ฒฐ๊ณผ 2ํ)โจ (job_id), -- ์ง๋ฌด๋ณ ์ง๊ณ(๊ฒฐ๊ณผ 2ํ)โจ () -- ์ ์ฒด ์ง๊ณ(๊ฒฐ๊ณผ 1ํ)โจ );
โ๏ธ ์คํ๊ฒฐ๊ณผ
department_id | job_id | total_salary | ๋น๊ณ |
10 | IT | 11,000 | |
10 | HR | 4,000 | |
10 | NULL | 15,000 | department_id 10์ ์๊ณ |
20 | IT | 7,000 | |
20 | HR | 5,000 | |
20 | NULL | 12,000 | department_id 20์ ์๊ณ |
NULL | IT | 18,000 | ์ง๋ฌด๋ณ ์ด๊ณ |
NULL | HR | 9,000 | ์ง๋ฌด๋ณ ์ด๊ณ |
NULL | NULL | 27,000 | ์ ์ฒด ์ดํฉ |
* GROUPING SETS๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ์๋ณ ์ง๊ณ, ์ง๋ฌด๋ณ ์ง๊ณ, ๊ทธ๋ฆฌ๊ณ ์ ์ฒด ์ดํฉ์ ๊ฐ๊ฐ ๋ณ๋๋ก ๊ตฌํ ์ ์์ต๋๋ค. ์ด์ฒ๋ผ GROUPING SETS๋ ๋ฐ์ดํฐ ์์ฝ์ ๋ณด๋ค ์ ์ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค.