[ORACLE] 5์ผ์ฐจ : SQLํจ์(์ง๊ณ ํจ์) - 2
ROLLUP์
์๊ณ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. grouping columns์ ์๋ฅผ N์ด๋ผ๊ณ ํ์๋ N+1 Level์ ์๊ณ๊ฐ ์์ฑ๋๋ค. ROLLUP์ ์ธ์๋ ๊ณ์ธต ๊ตฌ์กฐ์ด๋ฏ๋ก ์ธ์ ์์๊ฐ ๋ฐ๋๋ฉด ์ํ ๊ฒฐ๊ณผ๋ ๋ฐ๋๊ฒ ๋๋ค.
์ ๋ ฌ์ด ํ์ํ ๊ฒฝ์ฐ๋ ORDER BY์ ์ ๋ช ์์ ์ผ๋ก ์ ๋ ฌ ์ปฌ๋ผ์ด ํ์๋์ด์ผ ํ๋ค.
SELECT dept,pos,SUM(sal)
FROM emp
GROUP BY ROLLUP(dept,pos)
ORDER BY dept,pos;
๋ถ์๋ณ ์ธ์์์ ๋ง์ง๋ง์ ์ ์ฒด ์ธ์์ ์ถ
SELECT dept, count(*)
FROM emp
GROUP BY ROLLUP(dept);
CUBE์
CUBE๋ ๊ฒฐํฉ ๊ธฐ๋ฅํ ๋ชจ๋ ๊ฐ์ ๋ํ์ฌ ๋ค์ฐจ์ ์ง๊ณ๋ฅผ ์์ฑํ๋ค. ์๋ฅผ ๋ค์ด CUBE์ ์์ 3(n)๊ฐ์ ํํ์์ด ์ฃผ์ด์ง ๊ฒฝ์ฐ 8๊ฐ์ ๊ทธ๋ฃนํ๊ฐ ์ด๋ฃจ์ด์ง๋ค. CUBE์ ๊ฒฝ์ฐ ํ์๋ ์ธ์๋ค์ ๋ํ ๊ณ์ธต๋ณ ์ง๊ณ๋ฅผ ๊ตฌํ ์ ์์ผ๋ฉฐ, ์ด๋ ํ์๋ ์ธ์๋ค ๊ฐ์๋ ๊ณ์ธต ๊ตฌ์กฐ์ธ ROLLUP๊ณผ๋ ๋ฌ๋ฆฌ ํ๋ฑํ ๊ด๊ณ์ด๋ฏ๋ก ์ธ์์ ์์๊ฐ ๋ฐ๋๋ ๊ฒฝ์ฐ ํ๊ฐ์ ์ ๋ ฌ ์์๋ ๋ฐ๋์ ์์ด๋ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค. CUBE๋ ๊ฒฐ๊ณผ์ ๋ํ ์ ๋ ฌ์ด ํ์ํ ๊ฒฝ์ฐ๋ ORDER BY์ ์ ๋ช ์์ ์ผ๋ก ์ ๋ ฌํ ์ปฌ๋ผ์ ๋ช ์ํ๋ค.
SELECT dept,pos,SUM(sal)
FROM emp
GROUP BY city, CUBE(dept,pos)
ORDER BY city,dept,pos;
GROUPING
GROUPING ํจ์๋ ROLLUP์ด๋ CUBE์ ํจ๊ป ์ฌ์ฉํ์ฌ GROUPING ํจ์์ ๊ธฐ์ ๋ ์ปฌ๋ผ์ด ROLLUP์ด๋ CUBE์ ์์ ์ฌ์ฉ์ด ๋์๋์ง ๋ณด์ฌ์ฃผ๋ ํจ์์ด๋ค. GROUPING ํจ์๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ ์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ ๊ฐ์ค NULL๊ฐ์ด ์๋ค๋ฉด NULL๊ฐ์ด ROLLUP์ด๋ CUBE ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ก ์์ฑ๋ ๊ฒ์ธ์ง, ์๋ ํ ์ด๋ธ์์ NULL๊ฐ์ผ๋ก ์ ์ฅ๋ ๊ฒ์ธ์ง๋ฅผ ํ์ธํ ์ ์๋ค. GROUPING ํจ์๋ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก 0๋๋ 1์ ๋ฆฌํดํ๋ค. 0๊ฐ์ ๋ฆฌํด ํ๋ ๊ฒฝ์ฐ, ํด๋น ์ธ์๋ก ์ฐ์ธ ๊ฐ์ด ROLLUP์ด๋ CUBE์์ ์ฌ์ฉ๋์ด ์ก์์ ๋ํ๋ด๋ ๊ฒ์ด๊ณ , 1๊ฐ์ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ ROLLUP์ด๋ CUBE์ ์ฌ์ฉ๋์ง ์์์์ ๋ํ๋ธ๋ค.
SELECT dept,pos,SUM(sal),GROUPING(dept),GROUPING(pos)
FROM emp
GROUP BY city, CUBE(dept,pos)
ORDER BY city,dept,pos;
GROUP_ID
ํ์ GROUP_ID()
SELECT๋ฌธ์์ GROUP BY๋ก ๋ถ๋ฆฌ๋์ด ๋ณต์ ๋ ๋ฒํธ๋ก ๋ณต์ ํ์๋ฅผ ๊ตฌ๋ถํ๋๋ก ์ถ๋ ฅํ๋ค. ๋ฒํธ๊ฐ 0๋ถํฐ ์์๋๋ฏ๋ก n๋ฒ ๋ณต์ ๋์์ผ๋ฉด n-1 ๋ฒํธ๊ฐ ์ถ๋ ฅ๋๋ค. GROUP BY์ ํ์ฅ์ผ๋ก ์ธํ์ฌ ๊ฐ์ grouping์ ๋ํ๋ด๋ ๊ฐ์ด ์ค๋ณต๋์ด ๊ฒฐ๊ณผ ์งํฉ์ ํฌํจ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ค๋ณต๋ ๊ทธ๋ฃน๋ค์ ๊ตฌ๋ณ ํ๊ธฐ์ํด ์ฒ์์ผ๋ก ์ค๋ณต๋์ด ๋ํ๋๋ ํ์ ๋ํ์ฌ GROUP_ID ํจ์๋ 0์ ๋ฐํํ๊ณ , ๋๋จธ์ง ๊ฒฝ์ฐ์ ๋ํ์ฌ 1์ ๊ฐ์ ๋ฐํํ๋ค.
SELECT dept,empNO,name,SUM(sal),GROUP_ID()
FROM emp
GROUP BY dept, ROLLUP(dept,(empNO,name))
ORDER BY dept,GROUP_ID(),empNO;