๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ORACLE/SQL

[Oracle] ROLLUP ๊ณ ๊ธ‰ ์‚ฌ์šฉ๋ฒ• GROUPING ํ•จ์ˆ˜ :: ๋งˆ์ด์ž๋ชฝ

by ๐ŸŒปโ™š 2020. 3. 26.

GROUP BY

1
2
3
4
5
6
SELECT
    DEPTNO
    ,JOB
    ,SUM(SAL)
FROM EMP
GROUP BY DEPTNO, JOB;

ORACLE SCOTT ๊ณ„์ •์˜ EMP ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ด์„œ  ์‹ค์Šต์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” GROUP BY ๋ฌธ์ž…๋‹ˆ๋‹ค. SUM ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ ๋ถ€์„œ๋ณ„, ์ง์—…๋ณ„ ๊ธ‰์—ฌ์˜ ํ•ฉ์„ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

ROLLUP

1
2
3
4
5
6
SELECT
    DEPTNO
    ,JOB
    ,SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);

์œ„์˜ GROUP BY์ ˆ์— ROLLUP์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ  ๋ถ€์„œ๋ณ„, ์ง์—…๋ณ„ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ์ „์ฒด ๊ธ‰์—ฌ์˜ ํ•ฉ๊ณผ ๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ์˜ ํ•ฉ์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์˜๋ฌธ์ด ๋“œ๋Š”๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ธ‰์—ฌ๋กœ๋„ ํ•ฉ์„ ๊ณ„์‚ฐํ•ด์ฃผ๊ณ  ๋ถ€์„œ๋ณ„๋กœ๋„ ํ•ฉ์„ ๊ตฌํ•ด์ฃผ๋Š”๊ฑด ์ข‹์€๋ฐ... ์ „์ฒด ๊ธ‰์—ฌ์˜ ํ•ฉ๋งŒ ๋ณด์—ฌ์ฃผ๋˜๊ฐ€, ๋ถ€์„œ๋ณ„๋กœ ํ•ฉ๋งŒ ๋ณด์—ฌ์ฃผ๋˜๊ฐ€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€๋ฐ... ๊ทธ๊ฒŒ ๊ฐ€๋Šฅํ• ๊นŒ์š”?

 

์ „์ฒด ๊ธ‰์—ฌ ํ•ฉ๋งŒ ์ถœ๋ ฅ

1
2
3
4
5
6
SELECT
    DEPTNO
    ,JOB
    ,SUM(SAL)
FROM EMP
GROUP BY ROLLUP((DEPTNO, JOB));

๊ฐ€๋Šฅํ•˜๋„ค์š”.

 

 

๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ ํ•ฉ๋งŒ ์ถœ๋ ฅ

1
2
3
4
5
6
SELECT
    DEPTNO
    ,JOB
    ,SUM(SAL)
FROM EMP
GROUP BY DEPTNO, ROLLUP(JOB);

๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ ํ•ฉ๋งŒ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋„ค์š”. ๊ทธ๋Ÿผ ๋„๋ฐ์ฒด ROLLUP์ด ์–ด๋–ป๊ฒŒ ๋ฌด์Šจ ์›๋ฆฌ๋กœ ์ด๋ ‡๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฑธ๊นŒ์š”?

 

 

ROLLUP์˜ ์›๋ฆฌ

์œ„ ์ด๋ฏธ์ง€๊ฐ€ ROLLUP์˜ ์›๋ฆฌ๋ฅผ ์ „๋ถ€ ์„ค๋ช…ํ•ด์ค๋‹ˆ๋‹ค. ๊ฐ ๋ฒˆํ˜ธ๋Š” ํ•ด๋‹น ์นผ๋Ÿผ์œผ๋กœ GROUP BY๋ฅผ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ค€๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ GROUP BY์ ˆ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ด 4๊ฐœ์˜ GROUP์„ ๋งŒ๋“ ๋‹ค๋Š” ๋œป ์ž…๋‹ˆ๋‹ค. ROLLUP์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์›๋ฆฌ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

1. ROLLUP์˜ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ์นผ๋Ÿผ์„ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋นผ๋ฉด์„œ GROUP์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
2. "()"์˜ ์˜๋ฏธ๋Š” GROUP์ด ์—†๋Š” ์ฆ‰, ์ „์ฒด์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๋œป ์ž…๋‹ˆ๋‹ค. EX(SUM ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด SUM ๊ตฌํ•œ๋‹ค๋Š” ๋œป)
3. ๊ด„ํ˜ธ๋กœ ๋ฌถ์—ฌ์ ธ ์žˆ๋Š” ์ปฌ๋Ÿผ์€ ํ•˜๋‚˜๋กœ ๋ณธ๋‹ค๋Š” ๋œป ์ž…๋‹ˆ๋‹ค.
4. ROLLUP ์ด์ „์— ์ผ๋ฐ˜ ์ปฌ๋Ÿผ๊ณผ GROUP BY ํ•œ๋‹ค๋ฉด, ์ผ๋ฐ˜ ์ปฌ๋Ÿผ์€ ๋๊นŒ์ง€ ๋‚จ์Šต๋‹ˆ๋‹ค.

 

 

GROUP BY ROLLUP(A, B, C) ์˜ˆ์‹œ

1
2
3
4
5
6
7
SELECT
    DEPTNO
    ,JOB
    ,ENAME
    ,SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO,JOB,ENAME);

 

 

 

GROUP BY ROLLUP(A, (B, C)) ์˜ˆ์‹œ

1
2
3
4
5
6
7
SELECT
    DEPTNO
    ,JOB
    ,ENAME
    ,SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO,(JOB,ENAME));

 

 

 

GROUP BY A, ROLLUP((B, C)) ์˜ˆ์‹œ

1
2
3
4
5
6
7
SELECT
    DEPTNO
    ,JOB
    ,ENAME
    ,SUM(SAL)
FROM EMP
GROUP BY DEPTNO,ROLLUP((JOB,ENAME));

 

 

 

ROLLUP ํŠน์ด ์˜ˆ์ œ

์—ฌํƒœ๊นŒ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ROLLUP์ด ์–ด๋–ค ์›๋ฆฌ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์œ„์— ์˜ˆ์ œ ์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ผ๋‹จ, ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‹ˆ, ํ•œ ์นผ๋Ÿผ์—์„œ ์ปฌ๋Ÿผ ์ด์™ธ์˜ ๊ฐ’์ด ๋‚˜์˜ค๊ธฐ๋„ํ•˜๊ณ , ๊ธ‰์—ฌ ์ปฌ๋Ÿผ์—์„œ๋Š” ํ‰๊ท ๊ฐ’๊ณผ ํ•ฉ๊ณ„๊ฐ’์ด ๊ฐ™์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์šฐ์„  GROUPING, GROUPING_ID ๊ทธ๋ฆฌ๊ณ  ์ˆซ์ž GROUP ์ถ”๊ฐ€์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

 

 

GROUPING

1
2
3
4
5
6
7
8
SELECT
    DEPTNO
    ,GROUPING(DEPTNO) AS DG
    ,JOB
    ,GROUPING(JOB) AS JG
    ,SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);

GROUPING ํ•จ์ˆ˜๋Š” ROLLUP์ด๋ž‘ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์นผ๋Ÿผ์ด ROLLUP ๋˜์—ˆ์„ ๋•Œ ๊ทธ๋ฃน์—์„œ ๋น ์ ธ์žˆ๋‹ค๋ฉด 1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, GROUP BY ROLLUP ๊ฒฐ๊ณผ๋กœ NULL์ด ๋‚˜์™”์„ ๋•Œ 1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‚˜๋‹ค.

 

 

GROUPING_ID

1
2
3
4
5
6
7
8
9
SELECT
    DEPTNO
    ,JOB
    ,GROUPING(DEPTNO) AS DG
    ,GROUPING(JOB) AS JG
    ,GROUPING_ID(DEPTNO, JOB) GI
    ,SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);

GROUPING_ID ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๊ฐ๊ฐ ์นผ๋Ÿผ์˜ GROUPING ํ•จ์ˆ˜ ๊ฐ’์„ 2์ง„์ˆ˜๋กœ ํ•ฉ์ณ ํ•ด๋‹น 2์ง„์ˆ˜ ๊ฐ’์„ 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

 

 

์ˆซ์ž GROUP

1
2
3
4
5
6
ELECT
    DEPTNO
    ,JOB
    ,SUM(SAL)
FROM EMP
GROUP BY ROLLUP(1,DEPTNO, JOB);

์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ„ ROLLUP์€ ๋ญ˜๊นŒ์š”? ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‹ˆ ๋งˆ์ง€๋ง‰ 2๊ฐœ์˜ ์ค„์ด ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ROLLUP์˜ ์›๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ณ„ ๋‹ค๋ฅผ๊ฒƒ ์—†์Šต๋‹ˆ๋‹ค. JOB๊ณผ DEPTNO๊ฐ€ ROLLUP์—์„œ ๋น ์ง€๊ณ  1๋งŒ ๋‚จ์•˜์„๋•Œ SUM(SAL)์„ ๊ตฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์ˆ˜์— ๋Œ€ํ•œ GROUP์€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ „์ฒด ํ–‰์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋ผ๋Š” ์˜๋ฏธ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

GROUPING, GROUPING_ID, ์ˆซ์ž GROUP ์ข…ํ•ฉ

1
2
3
4
5
6
7
8
9
10
11
SELECT
    DEPTNO
    ,JOB
    ,GROUPING(1) AS "1"
    ,GROUPING(DEPTNO) AS "D"
    ,GROUPING(2) AS "2"
    ,GROUPING(JOB) AS "J"
    ,GROUPING_ID(1, DEPTNO, 2, JOB) AS ID
    ,SUM(SAL)
FROM EMP
GROUP BY ROLLUP(1,DEPTNO, 2, JOB);

GROUPING, GROUPING_ID, ์ˆซ์ž GROUP ๋ชจ๋‘ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ ํ…Œ์ด๋ธ”์— ๋†“๊ณ  ๋ณด๋‹ˆ๊นŒ ์ดํ•ด๊ฐ€ ๊ฐ€์‹œ๋‚˜์š”? ์ˆซ์ž๊ฐ€ ROLLUP์— ์˜จ๋‹ค๊ณ  ํ•ด๋„ ROLLUP์˜ ์›๋ฆฌ๋ฅผ ์•ˆ๋‹ค๋ฉด ํฐ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋‚จ์•„์žˆ๋Š” ์นผ๋Ÿผ๋“ค๋กœ GROUP BYํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ์›๋ฆฌ๋Œ€๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ตœ์ข… ํ’€์ด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT
    DECODE(
        GROUPING_ID(1, DEPTNO, 2, JOB)
        ,7'์ „์ฒด'
        ,15'์ „์ฒด'
        ,DEPTNO
    ) AS DEPTNO
    ,DECODE(
        GROUPING_ID(1, DEPTNO, 2, JOB)
        ,1'ํ•ฉ๊ณ„'
        ,3'ํ‰๊ท '
        ,7'ํ•ฉ๊ณ„'
        ,15'ํ‰๊ท '
        ,JOB
    ) AS JOB
    ,DECODE(
        GROUPING_ID(1, DEPTNO, 2, JOB)
        ,3, ROUND(AVG(SAL))
        ,15, ROUND(AVG(SAL))
        ,SUM( SAL)
    ) AS SAL
FROM EMP
GROUP BY ROLLUP(1,DEPTNO, 2, JOB);

 

๋Œ“๊ธ€