๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ๋ฐฐ์šฐ๊ณ  ์ตํžˆ๊ธฐ +/ORACLE

(41)[oracle]6์ผ์ฐจ: RANK(), DENSE_RANK(), RANK() OVER(PARTITION BY ), RANK() OVER(ORDER BY ), GROUP BY, ROLLUP(), GROUPING(), CUBE()

by ์ข…์ด๋นจ๋Œ€ 2023. 10. 24.
TOP

๋ชฉ์ฐจ

    1. 23.10.24(ํ™”)

    1. 20231024_01_scott.sql

    SELECT USER
    FROM DUAL;
    --==>> SCOTT
    
    --------------------------------------------------------------------------------
    --โ—‹ RANK() -> ๋“ฑ์ˆ˜(์ˆœ์œ„)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    
    SELECT EMPNO "์‚ฌ์›๋ฒˆํ˜ธ", ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL "๊ธ‰์—ฌ"
         , RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์ˆœ์œ„"   --** ๊ธ‰์—ฌ ๋‚ด๋ฆผ์ฐจ์ˆœ ๊ธฐ์ค€ ๋“ฑ์ˆ˜ ๋งค๊ธฐ๊ธฐ
    FROM EMP;
    --==>>
    /*
    7839	KING	10	5000	1
    7902	FORD	20	3000	2
    7788	SCOTT	20	3000	2
    7566	JONES	20	2975	4
    7698	BLAKE	30	2850	5
    7782	CLARK	10	2450	6
    7499	ALLEN	30	1600	7
    7844	TURNER	30	1500	8
    7934	MILLER	10	1300	9
    7521	WARD	30	1250	10
    7654	MARTIN	30	1250	10
    7876	ADAMS	20	1100	12
    7900	JAMES	30	950	    13
    7369	SMITH	20	800	    14
    */
    
    SELECT EMPNO "์‚ฌ์›๋ฒˆํ˜ธ", ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL "๊ธ‰์—ฌ"
         , RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) "๋ถ€์„œ๋ณ„๊ธ‰์—ฌ์ˆœ์œ„"
         , RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์ˆœ์œ„"
    FROM EMP;
    /*
    7839	KING	10	5000	1	1
    7902	FORD	20	3000	1	2
    7788	SCOTT	20	3000	1	2
    7566	JONES	20	2975	3	4
    7698	BLAKE	30	2850	1	5
    7782	CLARK	10	2450	2	6
    7499	ALLEN	30	1600	2	7
    7844	TURNER	30	1500	3	8
    7934	MILLER	10	1300	3	9
    7521	WARD	30	1250	4	10
    7654	MARTIN	30	1250	4	10
    7876	ADAMS	20	1100	4	12
    7900	JAMES	30	950	    6	13
    7369	SMITH	20	800	    5	14
    */
    
    SELECT EMPNO "์‚ฌ์›๋ฒˆํ˜ธ", ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL "๊ธ‰์—ฌ"
         , RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) "๋ถ€์„œ๋ณ„๊ธ‰์—ฌ์ˆœ์œ„"
         , RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์ˆœ์œ„"
    FROM EMP
    ORDER BY DEPTNO;
    /*
    7839	KING	10	5000	1	1
    7782	CLARK	10	2450	2	6
    7934	MILLER	10	1300	3	9
    7902	FORD	20	3000	1	2   -> 1
    7788	SCOTT	20	3000	1	2   -> 1
    7566	JONES	20	2975	3	4   -> 3
    7876	ADAMS	20	1100	4	12
    7369	SMITH	20	800	    5	14
    7698	BLAKE	30	2850	1	5
    7499	ALLEN	30	1600	2	7
    7844	TURNER	30	1500	3	8
    7654	MARTIN	30	1250	4	10
    7521	WARD	30	1250	4	10
    7900	JAMES	30	950	    6	13
    */
    
    --โ—‹ DENSE_RANK() -> ์„œ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    
    SELECT EMPNO "์‚ฌ์›๋ฒˆํ˜ธ", ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL "๊ธ‰์—ฌ"
         , DENSE_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) "๋ถ€์„œ๋ณ„๊ธ‰์—ฌ์„œ์—ด"
         , DENSE_RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์„œ์—ด"
    FROM EMP
    ORDER BY 3,4 DESC;
    /*
    7839	KING	10	5000	1	1
    7782	CLARK	10	2450	2	5
    7934	MILLER	10	1300	3	8
    7902	FORD	20	3000	1	2   -> 1
    7788	SCOTT	20	3000	1	2   -> 1
    7566	JONES	20	2975	2	3   -> 2
    7876	ADAMS	20	1100	3	10
    7369	SMITH	20	800	    4	12
    7698	BLAKE	30	2850	1	4
    7499	ALLEN	30	1600	2	6
    7844	TURNER	30	1500	3	7
    7654	MARTIN	30	1250	4	9
    7521	WARD	30	1250	4	9
    7900	JAMES	30	950	    5	11
    */
    
    /* 1-๋ฌธ์ œ & ํ•จ๊ป˜ ํ‘ผ ๋‚ด์šฉ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    --โ—‹ EMP ํ…Œ์ด๋ธ”์˜ ์‚ฌ์› ๋ฐ์ดํ„ฐ๋ฅผ
    --     ์‚ฌ์›๋ช…, ๋ถ€์„œ๋ฒˆํ˜ธ, ์—ฐ๋ด‰, ๋ถ€์„œ๋‚ด์—ฐ๋ด‰์ˆœ์œ„, ์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„ ํ•ญ๋ชฉ์œผ๋กœ ์กฐํšŒํ•œ๋‹ค.
    SELECT ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL*12+NVL(COMM,0) "์—ฐ๋ด‰"
         , RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL*12+NVL(COMM,0) DESC) "๋ถ€์„œ๋‚ด์—ฐ๋ด‰์ˆœ์œ„"
         , RANK() OVER(ORDER BY SAL*12+NVL(COMM,0) DESC) "์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„"
    FROM EMP;
    
    SELECT T.*
         , RANK() OVER(PARTITION BY T."๋ถ€์„œ๋ฒˆํ˜ธ" ORDER BY T."์—ฐ๋ด‰" DESC) "๋ถ€์„œ๋‚ด์—ฐ๋ด‰์ˆœ์œ„"
         , RANK() OVER(ORDER BY T."์—ฐ๋ด‰" DESC) "์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„"
    FROM
    (
         SELECT ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL*12+NVL(COMM,0) "์—ฐ๋ด‰"
         FROM EMP
    ) T;
    
    /*
    KING	10	60000	1	1
    FORD	20	36000	1	2
    SCOTT	20	36000	1	2
    JONES	20	35700	3	4
    BLAKE	30	34200	1	5
    CLARK	10	29400	2	6
    ALLEN	30	19500	2	7
    TURNER	30	18000	3	8
    MARTIN	30	16400	4	9
    MILLER	10	15600	3	10
    WARD	30	15500	5	11
    ADAMS	20	13200	4	12
    JAMES	30	11400	6	13
    SMITH	20	9600	5	14
    */
    
    /* 2-๋ฌธ์ œ & ํ•จ๊ป˜ ํ‘ผ ๋‚ด์šฉ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    --โ—‹ EMP ํ…Œ์ด๋ธ”์—์„œ ์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„๊ฐ€ 1๋“ฑ๋ถ€ํ„ฐ 5๋“ฑ๊นŒ์ง€๋งŒ..
    --   ์‚ฌ์›๋ช…, ๋ถ€์„œ๋ฒˆํ˜ธ, ์—ฐ๋ด‰, ์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„ ํ•ญ๋ชฉ์œผ๋กœ ์กฐํšŒํ•œ๋‹ค.
    SELECT T.*
    FROM(
        SELECT ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL*12+NVL(COMM,0) "์—ฐ๋ด‰"
             , RANK() OVER(ORDER BY SAL*12+NVL(COMM,0) DESC) "์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„"
        FROM EMP
    ) T
    WHERE T."์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„" BETWEEN 1 AND 5;
    
    /* 2-ํ•จ๊ป˜ ํ‘ผ ๋‚ด์šฉ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    SELECT ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL*12+NVL(COMM,0) "์—ฐ๋ด‰"
         , RANK() OVER(ORDER BY (SAL+12+NVL(COMM,0)) DESC) "์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„"
    FROM EMP
    WHERE ์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„ 1๋“ฑ๋ถ€ํ„ฐ 5๋“ฑ๊นŒ์ง€;
    
    SELECT ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL*12+NVL(COMM,0) "์—ฐ๋ด‰"
         , RANK() OVER(ORDER BY (SAL+12+NVL(COMM,0)) DESC) "์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„"
    FROM EMP
    WHERE RANK() OVER(ORDER BY (SAL+12+NVL(COMM,0)) DESC) <= 5;
    --==>> ์—๋Ÿฌ๋ฐœ์ƒ(ORA-30483: window  functions are not allowed here)
    
    --โ€ป ์œ„์˜ ๋‚ด์šฉ์€ RANK() OVER() ํ•จ์ˆ˜๋ฅผ WHERE ์กฐ๊ฑด์ ˆ์—์„œ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ์ด๋ฉฐ...
    --   ์ด ํ•จ์ˆ˜๋Š” WHERE ์กฐ๊ฑด์ ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ด๋‹ค.
    --   ์ด ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” INLINE VIEW ๋ฅผ ํ™œ์šฉํ•ด์„œ ํ’€์ดํ•ด์•ผ ํ•œ๋‹ค.
    
    SELECT T.*
    FROM
    (
        SELECT ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL*12+NVL(COMM,0) "์—ฐ๋ด‰"
             , RANK() OVER(ORDER BY (SAL+12+NVL(COMM,0)) DESC) "์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„"
        FROM EMP
    ) T
    WHERE T."์ „์ฒด์—ฐ๋ด‰์ˆœ์œ„" <= 5;
    
    --โ—‹ EMP ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ๋ถ€์„œ๋ณ„๋กœ ์—ฐ๋ด‰ ๋“ฑ์ˆ˜๊ฐ€ 1๋“ฑ ๋ถ€ํ„ฐ 2๋“ฑ ๊นŒ์ง€๋งŒ ์กฐํšŒํ•œ๋‹ค.
    --   ์‚ฌ์›๋ช…, ๋ถ€์„œ๋ฒˆํ˜ธ, ์—ฐ๋ด‰, ๋ถ€์„œ๋‚ด์—ฐ๋ด‰๋“ฑ์ˆ˜, ์ „์ฒด์—ฐ๋ด‰๋“ฑ์ˆ˜ ํ•ญ๋ชฉ์„
    --   ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
    
    SELECT T.*
    FROM
    (
        SELECT ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL*12+NVL(COMM,0) "์—ฐ๋ด‰"
             , RANK() OVER(PARTITION BY DEPTNO ORDER BY (SAL*12+NVL(COMM,0)) DESC) "๋ถ€์„œ๋‚ด์—ฐ๋ด‰๋“ฑ์ˆ˜"
             , RANK() OVER(ORDER BY (SAL*12+NVL(COMM,0)) DESC) "์ „์ฒด์—ฐ๋ด‰๋“ฑ์ˆ˜"
        FROM EMP
    ) T
    WHERE T."๋ถ€์„œ๋‚ด์—ฐ๋ด‰๋“ฑ์ˆ˜" <=2 ;
    
    
    
    SELECT T2.*
    FROM
    (
        SELECT T1.*
             , RANK() OVER(PARTITION BY T1."๋ถ€์„œ๋ฒˆํ˜ธ" ORDER BY T1."์—ฐ๋ด‰" DESC) "๋ถ€์„œ๋‚ด์—ฐ๋ด‰๋“ฑ์ˆ˜"
             , RANK() OVER(ORDER BY T1."์—ฐ๋ด‰" DESC) "์ „์ฒด์—ฐ๋ด‰๋“ฑ์ˆ˜"
        FROM
        (
        SELECT ENAME "์‚ฌ์›๋ช…", DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SAL*12+NVL(COMM,0) "์—ฐ๋ด‰"
        FROM EMP
        ) T1
    ) T2
    WHERE T2."๋ถ€์„œ๋‚ด์—ฐ๋ด‰๋“ฑ์ˆ˜" <=2 ;
    /*
    KING	10	60000	1	1
    CLARK	10	29400	2	6
    FORD	20	36000	1	2
    SCOTT	20	36000	1	2
    BLAKE	30	34200	1	5
    ALLEN	30	19500	2	7
    */
    
    --โ€ป ์ •์ •
    -- LN() ์ž์—ฐ ๋กœ๊ทธ ์กด์žฌํ•จ~!!!
    SELECT LN(95) "COL1"
    FROM DUAL;
    --==>> 4.55387689160054083460978676511404117675
    
    --โ€ป ์ถ”๊ฐ€
    --โ—‹ TRIM()
    SELECT TRIM('          TEST           ') "COL1"
        , LTRIM('          TEST           ') "COL2"
        , RTRIM('          TEST           ') "COL3"
    FROM DUAL;
    --==>> TEST	TEST           	          TEST
    
    --โ– โ– โ–  ๊ทธ๋ฃน ํ•จ์ˆ˜ โ– โ– โ– --
    
    -- SUM() ํ•ฉ, AVG() ํ‰๊ท , COUNT() ์นด์šดํŠธ, MAX() ์ตœ๋Œ€๊ฐ’, MIN() ์ตœ์†Œ๊ฐ’
    -- ,VARIENCE() ๋ถ„์‚ฐ, STDDEV() ํ‘œ์ค€ํŽธ์ฐจ
    
    --โ€ป ๊ทธ๋ฃนํ•จ์ˆ˜์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•
    --   ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๋“ค ์ค‘ NULL์ด ์กด์žฌํ•œ๋‹ค๋ฉด(ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด)
    --   ์ด NULL์€ ์ œ์™ธํ•œ ์ƒํƒœ๋กœ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    --   ์ฆ‰, NULL์€ ์—ฐ์‚ฐ์˜ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋œ๋‹ค.
    
    --โ—‹ SUM() ํ•ฉ
    -- EMP ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ์ „์ฒด ์‚ฌ์›๋“ค์˜ ๊ธ‰์—ฌ ์ด ํ•ฉ์„ ์กฐํšŒํ•œ๋‹ค.
    SELECT SAL
    FROM EMP;
    /*
    800
    1600
    1250
    2975
    1250
    2850
    2450
    3000
    5000
    1500
    1100
    950
    3000
    1300
    */
    
    SELECT SUM(SAL) -- 800 + 1600 + ... + 1300
    FROM EMP;
    --==>> 29025
    
    SELECT COMM
    FROM EMP;
    /*
    (null)
    300
    500
    (null)
    1400
    (null)
    (null)
    (null)
    (null)
    0
    (null)
    (null)
    (null)
    (null)
    */
    
    SELECT SUM(COMM)    -- NULL + 300 + 500 + NULL + ... + NULL --(X)
    FROM EMP;
    --==>> 2200
    
    --โ—‹ COUNT() ํ–‰(๋ ˆ์ฝ”๋“œ)์˜ ๊ฐฏ์ˆ˜ ์กฐํšŒ -> ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡ ๊ฑด์ธ์ง€... ํ™•์ธ...
    SELECT COUNT(ENAME)
    FROM EMP;
    --==>> 14
    
    SELECT COUNT(COMM)
    FROM EMP;
    --==>> 4
    
    SELECT COUNT(*)
    FROM EMP;
    --==>> 14
    -- COUNT๋ฅผ ์ˆ˜ํ–‰ํ• ๋•Œ๋Š” NULL ์ด ์กฐํšŒ์—์„œ ๋น ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ (*)์œผ๋กœ ์กฐํšŒ
    
    --โ—‹ AVG() ํ‰๊ท  ๋ฐ˜ํ™˜
    SELECT AVG(SAL) "COL1"
         , SUM(SAL) / COUNT(SAL) "COL2"
         , 29025 / 14 "COL3"
    FROM EMP;
    --==>> 2073.214285714285714285714285714285714286	2073.214285714285714285714285714285714286
    
    SELECT AVG(COMM) "COL1"
         , SUM(COMM) / COUNT(COMM) "COL2"
         , 2200 / 4 "COL3"  -- NULL์„ ์ œ์™ธํ•˜๊ณ  ์—ฐ์‚ฐ
         , 2200 / 14 "COL4" -- ์ •๋‹ต
    FROM EMP;
    
    --โ€ป ๋ฐ์ดํ„ฐ๊ฐ€ NULL์ธ ์ปฌ๋Ÿผ์˜ ๋ ˆ์ฝ”๋“œ๋Š” ์—ฐ์‚ฐ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋˜๊ธฐ ๋•Œ๋ฌธ์—
    -- ์ฃผ์˜ํ•˜์—ฌ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
    
    SELECT SUM(COMM) / COUNT(*) "COL1"
    FROM EMP;
    --==>> 157.142857142857142857142857142857142857
    
    -- VARIANCE() / STDDEV()
    -- โ€ป ํ‘œ์ค€ํŽธ์ฐจ์˜ ์ œ๊ณฑ์ด ๋ถ„์‚ฐ, ๋ถ„์‚ฐ์˜ ์ œ๊ณฑ๊ทผ์ด ํ‘œ์ค€ํŽธ์ฐจ
    
    SELECT VARIANCE(SAL), STDDEV(SAL)
    FROM EMP;
    --==>> 1398313.87362637362637362637362637362637	1182.503223516271699458653359613061928508
    
    SELECT POWER(STDDEV(SAL),2) "COL1"
         , VARIANCE(SAL) "COL2"
    FROM EMP;
    --==>> 
    /*
    1398313.87362637362637362637362637362637	
    1398313.87362637362637362637362637362637
    */
    
    SELECT SQRT(VARIANCE(SAL)) "COL1"
    FROM EMP;
    --==>> 1182.503223516271699458653359613061928508
    
    -- MAX() / MIN()
    -- ์ตœ๋Œ€๊ฐ’ / ์ตœ์†Œ๊ฐ’ ๋ฐ˜ํ™˜
    SELECT MAX(SAL) "COL1"
         , MIN(SAL) "COL2"
    FROM EMP;
    --==>>800
    
    --โ€ป ์ฃผ์˜
    SELECT ENAME, SUM(SAL)
    FROM EMP;
    --==>> ์—๋Ÿฌ๋ฐœ์ƒ(ORA-00937: not a single-group group function)
    
    SELECT ENAME
    FROM EMP;
    
    SELECT SUM(SAL)
    FROM EMP;
    --==>> 29025
    
    SELECT DEPTNO, SUM(SAL) --** DEPTNO : 14๊ฑด, SUM(SAL)์€ ๋‹จ์ผ๊ฑด
    FROM EMP;
    --==>> ์—๋Ÿฌ ๋ฐœ์ƒ(ORA-00937: not a single-group group function)
    
    SELECT DEPTNO, SUM(SAL)
    FROM EMP
    GROUP BY DEPTNO
    ORDER BY 1;
    /*
    10	8750
    20	10875
    30	9400
    */
    
    SELECT DEPTNO, SAL
    FROM EMP
    ORDER BY 1;
    --==>>
    /*
    10	2450 โ”
    10	5000 โ”‚10
    10	1300 โ”˜
    20	2975 โ”
    20	3000 โ”‚
    20	1100 โ”‚20
    20	800  โ”‚
    20	3000 โ”˜
    30	1250 โ”
    30	1500 โ”‚
    30	1600 โ”‚30
    30	950  โ”‚
    30	2850 โ”‚
    30	1250 โ”˜
    */
    
    --โ—‹ ๊ธฐ์กด ํ…Œ์ด๋ธ” ์ œ๊ฑฐ
    DROP TABLE TBL_EMP;
    --==>> Table TBL_EMP์ด(๊ฐ€) ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    
    --โ—‹ ์‹ค์Šต ํ…Œ์ด๋ธ” ์ƒ์„ฑ(๋ณต์‚ฌ)
    CREATE TABLE TBL_EMP
    AS
    SELECT *
    FROM EMP;
    --==>> Table TBL_EMP์ด(๊ฐ€) ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    
    --โ—‹ ์‹ค์Šต ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์ž…๋ ฅ
    INSERT INTO TBL_EMP VALUES
    (8001, '์ด์œค์ˆ˜', 'CLERK', 7566, SYSDATE, 1500, 10, NULL);
    --==>> 1 ํ–‰ ์ด(๊ฐ€) ์‚ฝ์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    INSERT INTO TBL_EMP VALUES
    (8002, '์ž„ํ•˜์„ฑ', 'CLERK', 7566, SYSDATE, 2000, 10, NULL);
    --==>> 1 ํ–‰ ์ด(๊ฐ€) ์‚ฝ์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    INSERT INTO TBL_EMP VALUES
    (8003, '๊น€๋ฏผ์ง€', 'SALESMAN', 7698, SYSDATE, 1700, NULL, NULL);
    --==>> 1 ํ–‰ ์ด(๊ฐ€) ์‚ฝ์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    INSERT INTO TBL_EMP VALUES
    (8006, '์ •ํ˜„์šฑ', 'SALESMAN', 7698, SYSDATE, 2500, NULL, NULL);
    --==>> 1 ํ–‰ ์ด(๊ฐ€) ์‚ฝ์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    INSERT INTO TBL_EMP VALUES
    (8007, '๋ฐ•๋‚˜์˜', 'SALESMAN', 7698, SYSDATE, 1000, NULL, NULL);
    --==>> 1 ํ–‰ ์ด(๊ฐ€) ์‚ฝ์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    
    --โ—‹ ํ™•์ธ
    SELECT * 
    FROM TBL_EMP;
    /*
    7369	SMITH	CLERK	    7902	1980-12-17	800		(null)  20
    7499	ALLEN	SALESMAN	7698	1981-02-20	1600	300	    30
    7521	WARD	SALESMAN	7698	1981-02-22	1250	500	    30
    7566	JONES	MANAGER	    7839	1981-04-02	2975		    20
    7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1400	30
    7698	BLAKE	MANAGER	    7839	1981-05-01	2850	(null)	30
    7782	CLARK	MANAGER	    7839	1981-06-09	2450	(null)	10
    7788	SCOTT	ANALYST	    7566	1987-07-13	3000	(null)	20
    7839	KING	PRESIDENT		    1981-11-17	5000	(null)	10
    7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	    30
    7876	ADAMS	CLERK	    7788	1987-07-13	1100	(null)	20
    7900	JAMES	CLERK	    7698	1981-12-03	950		(null)  30
    7902	FORD	ANALYST	    7566	1981-12-03	3000	(null)  20
    7934	MILLER	CLERK	    7782	1982-01-23	1300	(null)  10
    8001	์ด์œค์ˆ˜	CLERK	    7566	2023-10-24	1500	10	    (null)
    8002	์ž„ํ•˜์„ฑ	CLERK	    7566	2023-10-24	2000	10	    (null)
    8003	๊น€๋ฏผ์ง€	SALESMAN	7698	2023-10-24	1700	(null)  (null)	
    8006	์ •ํ˜„์šฑ	SALESMAN	7698	2023-10-24	2500	(null)  (null)
    8007	๋ฐ•๋‚˜์˜	SALESMAN	7698	2023-10-24	1000	(null)  (null)
    */
    
    --โ—‹ ์ปค๋ฐ‹
    COMMIT;
    
    SELECT DEPTNO, SAL, COMM
    FROM TBL_EMP
    ORDER BY COMM DESC;
    /*
    20	800	
    	1700	
    	1000	
    10	1300	
    20	2975	
    30	2850	
    10	2450	
    20	3000	
    10	5000	
    	2500	
    20	1100	
    30	950	
    20	3000	
    30	1250	1400
    30	1250	500
    30	1600	300
    	1500	10
    	2000	10
    30	1500	0
    */
    
    -- ์˜ค๋ผํด์—์„œ๋Š” NULL์„ ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
    -- (ORACLE 9I ๊นŒ์ง€๋Š” NULL์„ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผํ–ˆ์—ˆ๋‹ค.)
    -- (MSSQL ์€ NULL์„ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.)
    
    --โ—‹ TBL_EMP ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌํ•ฉ ์กฐํšŒ
    --   ๋ถ€์„œ๋ฒˆํ˜ธ, ๊ธ‰์—ฌํ•ฉ ํ•ญ๋ชฉ  ์กฐํšŒ
    SELECT DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY DEPTNO
    ORDER BY DEPTNO;
    /*
    10	    8750
    20	    10875
    30	    9400
    (null)	8700     -- ๋ถ€์„œ๋ฒˆํ˜ธ๊ฐ€ NULL ์ธ ์‚ฌ์›๋“ค์˜ ๊ธ‰์—ฌํ•ฉ
    */
    
    SELECT DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    /*
    10	8750
    20	10875
    30	9400
    	8700  -- ๋ถ€์„œ๋ฒˆํ˜ธ๊ฐ€ NULL ์ธ ์‚ฌ์›๋“ค์˜ ๊ธ‰์—ฌํ•ฉ
    	37725 -- ๋ชจ๋“ ๋ถ€์„œ ์ง์›๋“ค์˜ ๊ธ‰์—ฌํ•ฉ
    */
    
    /*
    10	    8750
    20	    10875
    30	    9400
    ์ธํ„ด	8700 
    */
    
    /*
    10	    8750
    20	    10875
    30	    9400
    ์ธํ„ด	8700 
    */
    
    /*
    10	        8750
    20	        10875
    30	        9400
    ์ธํ„ด	    8700
    ๋ชจ๋“ ๋ถ€์„œ	37725
    */
    
    SELECT DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM EMP
    GROUP BY ROLLUP(DEPTNO);
    /*
    10	8750
    20	10875
    30	9400
    	29025
    */
    
    /* 3- ๋ฌธ์ œ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    /*
    10	        8750
    20	        10875
    30	        9400
    ๋ชจ๋“ ๋ถ€์„œ	29025
    */
    -- EMP ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด ์กฐํšŒ๋˜๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ๊ตฌ์„ฑํ•œ๋‹ค.  
    
    /* 3- ๋‚ด๊ฐ€ ํ‘ผ ๋‚ด์šฉ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    SELECT CASE WHEN DEPTNO IS NULL THEN '๋ชจ๋“ ๋ถ€์„œ'
                ELSE TO_CHAR(DEPTNO)
           END
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM EMP
    GROUP BY ROLLUP(DEPTNO);
    
    SELECT NVL(TO_CHAR(DEPTNO),'๋ชจ๋“ ๋ถ€์„œ') "๋ถ€์„œ๋ฒˆํ˜ธ"
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM EMP
    GROUP BY ROLLUP(DEPTNO);
    
    /* 3-ํ•จ๊ป˜ ํ‘ผ ๋‚ด์šฉ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    SELECT NVL2(DEPTNO, TO_CHAR(DEPTNO),'๋ชจ๋“ ๋ถ€์„œ') "๋ถ€์„œ๋ฒˆํ˜ธ"
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM EMP
    GROUP BY ROLLUP(DEPTNO);
    
    SELECT NVL2(DEPTNO, TO_CHAR(DEPTNO),'๋ชจ๋“ ๋ถ€์„œ') "๋ถ€์„œ๋ฒˆํ˜ธ"
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    --==>>
    /*
    10	        8750
    20	        10875
    30	        9400
    ๋ชจ๋“ ๋ถ€์„œ	8700
    ๋ชจ๋“ ๋ถ€์„œ	37725
    */
    
    -- GROUPING()
    SELECT GROUPING(DEPTNO), DEPTNO "๋ถ€์„œ๋ฒˆํ˜ธ", SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    
    /*
    GROUPING(DEPTNO)	๋ถ€์„œ๋ฒˆํ˜ธ	๊ธ‰์—ฌํ•ฉ
    0	                    10	    8750
    0	                    20	    10875
    0	                    30	    9400
    0	                (null)	    8700
    1	                (null)	    37725
    */
    /*
    ๋ถ€์„œ๋ฒˆํ˜ธ	๊ธ‰์—ฌํ•ฉ
    10	    8750
    20	    10875
    30	    9400
    (null)	    8700
    (null)	    37725
    */
    
    /* 4- ๋ฌธ์ œ & ํ•จ๊ป˜ ํ‘ผ ํ’€์ด ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    /*
    ๋ถ€์„œ๋ฒˆํ˜ธ	๊ธ‰์—ฌํ•ฉ
    10	     8750
    20	     10875
    30	     9400
    ์ธํ„ด	 8700
    ๋ชจ๋“ ๋ถ€์„œ 37725
    */
    -- ์ด์™€ ๊ฐ™์ด ์กฐํšŒ๋˜๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
    
    SELECT CASE WHEN GROUPING(DEPTNO) = 0 AND DEPTNO IS NOT NULL THEN TO_CHAR(DEPTNO)
                WHEN GROUPING(DEPTNO) = 0 AND DEPTNO IS NULL THEN '์ธํ„ด'
                WHEN GROUPING(DEPTNO) = 1 THEN '๋ชจ๋“ ๋ถ€์„œ'
                ELSE '-1'
           END "๋ถ€์„œ๋ฒˆํ˜ธ"
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    
    SELECT NVL(TO_CHAR(DEPTNO), CASE GROUPING(DEPTNO) WHEN 0 THEN '๋‹จ์ผ๋ถ€์„œ' ELSE '๋ชจ๋“ ๋ถ€์„œ' END) "๋ถ€์„œ๊ธฐํ˜ธ" 
        , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    
    --โ€ปํžŒํŠธ
    SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN '๋‹จ์ผ๋ถ€์„œ' ELSE '๋ชจ๋“ ๋ถ€์„œ' END "๋ถ€์„œ๊ธฐํ˜ธ"
        , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    /*
    ๋‹จ์ผ๋ถ€์„œ	8750
    ๋‹จ์ผ๋ถ€์„œ	10875
    ๋‹จ์ผ๋ถ€์„œ	9400
    ๋‹จ์ผ๋ถ€์„œ	8700
    ๋ชจ๋“ ๋ถ€์„œ	37725
    */
    
    SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN DEPTNO ELSE '๋ชจ๋“ ๋ถ€์„œ' END "๋ถ€์„œ๊ธฐํ˜ธ"
        , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    --==>> ์—๋Ÿฌ ๋ฐœ์ƒ(ORA-00932: inconsistent datatypes: expected NUMBER got CHAR)
    
    SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN TO_CHAR(DEPTNO) ELSE '๋ชจ๋“ ๋ถ€์„œ' END "๋ถ€์„œ๊ธฐํ˜ธ"
        , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    /*
    10	8750
    20	10875
    30	9400
    	8700
    ๋ชจ๋“ ๋ถ€์„œ	37725
    */
    
    SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO),'์ธํ„ด') ELSE '๋ชจ๋“ ๋ถ€์„œ' END "๋ถ€์„œ๊ธฐํ˜ธ"
        , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO);
    /*
    10	8750
    20	10875
    30	9400
    ์ธํ„ด	8700
    ๋ชจ๋“ ๋ถ€์„œ	37725
    */
    
    /* 5- ๋ฌธ์ œ & ํ•จ๊ป˜ ํ‘ผ ํ’€์ด ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    --โ—‹ TBL_SAWON ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ
    --   ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กฐํšŒ๋  ์ˆ˜ ์žˆ๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
    /*
    ์„ฑ๋ณ„       ๊ธ‰์—ฌํ•ฉ
    -------  ---------
    ๋‚จ         XXXX
    ์—ฌ        XXXXX
    ๋ชจ๋“ ์‚ฌ์› XXXXXX
    */
     
    SELECT NVL(T.์„ฑ๋ณ„,'๋ชจ๋“ ์‚ฌ์›') "์„ฑ๋ณ„", SUM(T.๊ธ‰์—ฌ) "๊ธ‰์—ฌํ•ฉ"
    FROM
    (
        SELECT CASE WHEN SUBSTR(JUBUN,7,1) IN ('1','3') THEN '๋‚จ'
                    WHEN SUBSTR(JUBUN,7,1) IN ('2','4') THEN '์—ฌ'
                    ELSE '์ œ3์˜ ์„ฑ'
               END "์„ฑ๋ณ„"
             , SAL "๊ธ‰์—ฌ"
        FROM TBL_SAWON
    ) T
    GROUP BY ROLLUP(T.์„ฑ๋ณ„);
    
    SELECT CASE GROUPING(T.์„ฑ๋ณ„) WHEN 0 THEN T.์„ฑ๋ณ„
                ELSE '๋ชจ๋“ ์‚ฌ์›'   
           END "์„ฑ๋ณ„"
         , SUM(T.๊ธ‰์—ฌ) "๊ธ‰์—ฌํ•ฉ"
    FROM
    (
        SELECT CASE WHEN SUBSTR(JUBUN,7,1) IN ('1','3') THEN '๋‚จ'
                    WHEN SUBSTR(JUBUN,7,1) IN ('2','4') THEN '์—ฌ'
                    ELSE '์ œ3์˜ ์„ฑ'
               END "์„ฑ๋ณ„"
             , SAL "๊ธ‰์—ฌ"
        FROM TBL_SAWON
    ) T
    GROUP BY ROLLUP(T.์„ฑ๋ณ„);
    
    --โ—‹ TBL_SAWON ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ
    --    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กฐํšŒ๋  ์ˆ˜ ์žˆ๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
        
    /*
    ์—ฐ๋ น๋Œ€     ์ธ์›์ˆ˜
    10          X
    20          X
    50          X
    ์ „์ฒด        X
    */
    ์˜ค๋Š˜ ๋…„๋„ - ์ƒ๋…„์›”์ผ = ํ˜„์žฌ๋‚˜์ด
    SELECT NVL(TO_CHAR(T.์—ฐ๋ น),'์ „์ฒด') "์—ฐ๋ น๋Œ€" , COUNT(T.์—ฐ๋ น) "์ธ์›์ˆ˜"
    FROM(
        SELECT TRUNC(EXTRACT(YEAR FROM SYSDATE) - DECODE(SUBSTR(JUBUN,7,1),'3',2000,'4',2000,'1',1900,'2',1900,0) - SUBSTR(JUBUN,1,2) +1,-1) "์—ฐ๋ น"
        FROM TBL_SAWON
    ) T
    GROUP BY ROLLUP(T.์—ฐ๋ น);
    
    -- ๋ฐฉ๋ฒ•1. -> INLINE VIEW ๋ฅผ ๋‘ ๋ฒˆ ์ค‘์ฒฉ
    SELECT NVL(TO_CHAR(T2.์—ฐ๋ น๋Œ€),'์ „์ฒด') "์—ฐ๋ น๋Œ€" , COUNT(T2.์—ฐ๋ น๋Œ€) "์ธ์›์ˆ˜"
    FROM
    (
        -- ์—ฐ๋ น๋Œ€
        SELECT CASE WHEN T1.๋‚˜์ด >= 50 THEN 50
                    WHEN T1.๋‚˜์ด >= 40 THEN 40
                    WHEN T1.๋‚˜์ด >= 30 THEN 30
                    WHEN T1.๋‚˜์ด >= 20 THEN 20
                    WHEN T1.๋‚˜์ด >= 10 THEN 10
                    ELSE 0
               END "์—ฐ๋ น๋Œ€"
        FROM
        (
            -- ๋‚˜์ด
            SELECT CASE WHEN SUBSTR(JUBUN, 7,1) IN ('1','2')
                THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899)
                WHEN SUBSTR(JUBUN, 7,1) IN ('3','4')
                THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1999)
                ELSE -1
            END "๋‚˜์ด"
            FROM TBL_SAWON
        ) T1
    ) T2
    GROUP BY ROLLUP(T2.์—ฐ๋ น๋Œ€);
    
    -- ๋ฐฉ๋ฒ•2. -> INLINE VIEW ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ
    SELECT CASE GROUPING(T.์—ฐ๋ น๋Œ€) WHEN 0 THEN TO_CHAR(T.์—ฐ๋ น๋Œ€) 
                                   ELSE '์ „์ฒด'
           END "์—ฐ๋ น๋Œ€2"
          ,COUNT(*) "์ธ์›์ˆ˜"
    FROM
    (
        SELECT TRUNC(CASE WHEN SUBSTR(JUBUN,7,1) IN ('1','2')
                    THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899)
                    WHEN SUBSTR(JUBUN,7,1) IN ('3','4')
                    THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1999)
                    ELSE -1
               END,-1) "์—ฐ๋ น๋Œ€"
        FROM TBL_SAWON
    ) T
    GROUP BY ROLLUP(T.์—ฐ๋ น๋Œ€);
    
    SELECT TRUNC(27, -1) "COL1"
    FROM DUAL;
    
    SELECT DEPTNO, JOB, SUM(SAL)
    FROM EMP
    GROUP BY DEPTNO, JOB
    ORDER BY 1,2;
    /*
    DEPTNO	JOB	SUM(SAL)
    10	CLERK	1300
    10	MANAGER	2450
    10	PRESIDENT	5000
    20	ANALYST	6000
    20	CLERK	1900
    20	MANAGER	2975
    30	CLERK	950
    30	MANAGER	2850
    30	SALESMAN	5600
    */
    
    SELECT DEPTNO, JOB, SUM(SAL)
    FROM EMP
    GROUP BY ROLLUP(DEPTNO, JOB)
    ORDER BY 1,2;
    /*
    DEPTNO	JOB	        SUM(SAL)
    10	    CLERK	    1300    - 10๋ฒˆ ๋ถ€์„œ CLERK ์ง์ข…์˜ ๊ธ‰์—ฌ ํ•ฉ
    10	    MANAGER	    2450    - 10๋ฒˆ ๋ถ€์„œ MANGER ์ง์ข…์˜ ๊ธ‰์—ฌ ํ•ฉ
    10	    PRESIDENT	5000
    10	    (null)	    8750    - 10๋ฒˆ ์ฃผ์„œ ๋ชจ๋“  ์ง์ข…์˜ ๊ธ‰์—ฌ ํ•ฉ
    20	    ANALYST	    6000
    20	    CLERK	    1900
    20	    MANAGER	    2975
    20	    (null)	    10875
    30	    CLERK	    950
    30	    MANAGER	    2850
    30	    SALESMAN	5600
    30	    (null)	    9400
    (null)	(null)	    29025   - ๋ชจ๋“  ์ง์ข… ๋ชจ๋“  ๋ถ€์„œ์˜ ๊ธ‰์—ฌ ํ•ฉ
    */
    
    --โ—‹ CUBE() -> ROLLUP() ๋ณด๋‹ค ๋” ์ž์„ธํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค.
    SELECT DEPTNO, JOB, SUM(SAL)
    FROM EMP
    GROUP BY CUBE(DEPTNO, JOB)
    ORDER BY 1,2;
    /*
    DEPTNO	JOB	SUM(SAL)
    10	    CLERK	    1300
    10	    MANAGER	    2450
    10	    PRESIDENT	5000
    10	    (null)	    8750
    20	    ANALYST	    6000
    20	    CLERK	    1900
    20	    MANAGER	    2975
    20	    (null)	    10875
    30	    CLERK	    950
    30	    MANAGER	    2850
    30	    SALESMAN	5600
    30	    (null)	    9400
    (null)	ANALYST	    6000    - ๋ชจ๋“  ๋ถ€์„œ ANALYST ์ง์ข…์˜ ๊ธ‰์—ฌํ•ฉ -- ์ถ”๊ฐ€
    (null)	CLERK	    4150    - ๋ชจ๋“  ๋ถ€์„œ CLECK ์ง์ข…์˜ ๊ธ‰์—ฌํ•ฉ
    (null)	MANAGER	    8275    - ๋ชจ๋“  ๋ถ€์„œ MANAGER ์ง์ข…์˜ ๊ธ‰์—ฌํ•ฉ
    (null)	PRESIDENT	5000    - ๋ชจ๋“  ๋ถ€์„œ PRESIDNT ์ง์ข…์˜ ๊ธ‰์—ฌํ•ฉ
    (null)	SALESMAN	5600
    (null)	(null)	    29025
    */
    -- โ€ป ROLLUP()๊ณผ CUBE() ๋Š” ๊ทธ๋ฃน์„ ๋ฌถ์–ด์ฃผ๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค.(์ฐจ์ด)
    
    --EX.
    
    --ROLLUP(A,B,C)
    -- -> (A,B,C) / (A,B) / (A) / ()
    
    --CUBE(A,B,C)
    -- -> (A,B,C) / (A,B) / (A,C) / (B,C) / (A)/ (B)/ (C) {}
    
    --> ์œ™์˜ ๊ณผ์ •(ROLLUP())์€ ๋ฌถ์Œ ๋ฐฉ์‹์ด ๋‹ค์†Œ ๋ชจ์ž๋ž„ ๋•Œ๊ฐ€ ์žˆ๊ณ 
    -- ์•„๋ž˜์˜ ๊ณผ์ •(CUBE())์€ ๋ฌถ์Œ ๋ฐฉ์‹์ด ๋‹ค์ง€๋‚˜์น  ๋•Œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธใ…‡
    -- ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์˜ ์ฟผ๋ฆฌ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
    -- ๋‹ค์Œ ์ž‘์„ฑํ•˜๋Š” ํ€„๋ฆฌ๋Š” ์กฐํšŒํ•˜๊ณ  ์žํ•˜๋Š” ๊ทธ๋ฃน๋งŒ
    -- <GROUPING SETS>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒ์ ์œผ๋กœ ๋ฌถ์–ด์คŒ
    
    SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '์ธํ„ด')
                ELSE '์ „์ฒด๋ถ€์„œ'
          END "๋ถ€์„œ๋ฒˆํ˜ธ"
          , CASE GROUPING(JOB) WHEN 0 THEN JOB
                ELSE '์ „์ฒด์ง์ข…'
         END "์ง์ข…"
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY ROLLUP(DEPTNO, JOB)
    ORDER BY 1,2;
    /*
    10	        CLERK	    1300
    10	        MANAGER	    2450
    10	        PRESIDENT	5000
    10	        ์ „์ฒด์ง์ข…	8750
    20	        ANALYST	    6000
    20	        CLERK	    1900
    20	        MANAGER	    2975
    20	        ์ „์ฒด์ง์ข…	10875
    30	        CLERK	    950
    30	        MANAGER	    2850
    30	        SALESMAN	5600
    30	        ์ „์ฒด์ง์ข…	9400
    ์ธํ„ด	    CLERK	    3500
    ์ธํ„ด	    SALESMAN	5200
    ์ธํ„ด	    ์ „์ฒด์ง์ข…	8700
    ์ „์ฒด๋ถ€์„œ	์ „์ฒด์ง์ข…	37725
    
    */
    
    SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '์ธํ„ด')
                ELSE '์ „์ฒด๋ถ€์„œ'
          END "๋ถ€์„œ๋ฒˆํ˜ธ"
          , CASE GROUPING(JOB) WHEN 0 THEN JOB
                ELSE '์ „์ฒด์ง์ข…'
         END "์ง์ข…"
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY CUBE(DEPTNO, JOB)
    ORDER BY 1,2;
    
    /*
    10	        CLERK	    1300
    10	        MANAGER	    2450
    10	        PRESIDENT	5000
    10	        ์ „์ฒด์ง์ข…	8750
    20	        ANALYST	    6000
    20	        CLERK	    1900
    20	        MANAGER	    2975
    20	        ์ „์ฒด์ง์ข…	10875
    30	        CLERK	    950
    30	        MANAGER	    2850
    30	        SALESMAN	5600
    30	        ์ „์ฒด์ง์ข…	9400
    ์ธํ„ด	    CLERK	    3500
    ์ธํ„ด	    SALESMAN	5200
    ์ธํ„ด	    ์ „์ฒด์ง์ข…	8700
    ์ „์ฒด๋ถ€์„œ	ANALYST	    6000
    ์ „์ฒด๋ถ€์„œ	CLERK	    7650
    ์ „์ฒด๋ถ€์„œ	MANAGER	    8275
    ์ „์ฒด๋ถ€์„œ	PRESIDENT	5000
    ์ „์ฒด๋ถ€์„œ	SALESMAN	10800
    ์ „์ฒด๋ถ€์„œ	์ „์ฒด์ง์ข…	37725
    */
    
    SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '์ธํ„ด')
                ELSE '์ „์ฒด๋ถ€์„œ'
          END "๋ถ€์„œ๋ฒˆํ˜ธ"
          , CASE GROUPING(JOB) WHEN 0 THEN JOB
                ELSE '์ „์ฒด์ง์ข…'
         END "์ง์ข…"
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY GROUPING SETS((DEPTNO, JOB), (DEPTNO), (JOB), ())
    ORDER BY 1,2;
    --==>> CUBE()๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    
    SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '์ธํ„ด')
                ELSE '์ „์ฒด๋ถ€์„œ'
          END "๋ถ€์„œ๋ฒˆํ˜ธ"
          , CASE GROUPING(JOB) WHEN 0 THEN JOB
                ELSE '์ „์ฒด์ง์ข…'
         END "์ง์ข…"
         , SUM(SAL) "๊ธ‰์—ฌํ•ฉ"
    FROM TBL_EMP
    GROUP BY GROUPING SETS((DEPTNO, JOB), (DEPTNO), ())
    ORDER BY 1,2;
    --==>> RULLUP() ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    
    --------------------------------------------------------------------------------
    /* 6- ๋ฌธ์ œ & ํ•จ๊ป˜ ํ‘ผ ํ’€์ด ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    --โ—‹ TBL_EMP ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ
    --   ์ž…์‚ฌ๋…„๋„๋ณ„ ์ธ์›์ˆ˜๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    SELECT *
    FROM TBL_EMP;
    
    SELECT EXTRACT(YEAR FROM HIREDATE) "์ž…์‚ฌ๋…„๋„", COUNT(*) "์ธ์›"
    FROM TBL_EMP
    GROUP BY EXTRACT(YEAR FROM HIREDATE);
    /*
    1982	1
    2023	5
    1987	2
    1980	1
    1981	10
    */
    
    SELECT EXTRACT(YEAR FROM HIREDATE) "์ž…์‚ฌ๋…„๋„"
        , COUNT(*) "์ธ์›์ˆ˜"
    FROM TBL_EMP
    GROUP BY EXTRACT(YEAR FROM HIREDATE)
    ORDER BY 1;
    
    SELECT TO_CHAR(HIREDATE, 'YYYY') "์ž…์‚ฌ๋…„๋„"
        , COUNT(*) "์ธ์›์ˆ˜"
    FROM TBL_EMP
    GROUP BY TO_CHAR(HIREDATE, 'YYYY')
    ORDER BY 1;
    
    SELECT EXTRACT(YEAR FROM HIREDATE) "์ž…์‚ฌ๋…„๋„"
        , COUNT(*) "์ธ์›์ˆ˜"
    FROM TBL_EMP
    GROUP BY TO_CHAR(HIREDATE, 'YYYY')
    ORDER BY 1;
    --==>> ์—๋Ÿฌ๋ฐœ์ƒ: GROUP BY์™€ SELECT์˜ ํ˜•์„ ๋งž์ถฐ์•ผํ•จ
    
    SELECT TO_CHAR(HIREDATE, 'YYYY') "์ž…์‚ฌ๋…„๋„"
        , COUNT(*) "์ธ์›์ˆ˜"
    FROM TBL_EMP
    GROUP BY EXTRACT(YEAR FROM HIREDATE)
    ORDER BY 1;
    --==>> ์—๋Ÿฌ๋ฐœ์ƒ(ORA-00979: not a GROUP BY expression)
    
    SELECT TO_NUMBER(TO_CHAR(HIREDATE, 'YYYY')) "์ž…์‚ฌ๋…„๋„"
        , COUNT(*) "์ธ์›์ˆ˜"
    FROM TBL_EMP
    GROUP BY EXTRACT(YEAR FROM HIREDATE)
    ORDER BY 1;
    --==>> ์—๋Ÿฌ๋ฐœ์ƒ(ORA-00979: not a GROUP BY expression)
    
    SELECT CASE GROUPING(TO_CHAR(HIREDATE, 'YYYY')) WHEN 0
                THEN TO_CHAR(HIREDATE, 'YYYY')
                ELSE '์ „์ฒด'
            END "์ž…์‚ฌ๋…„๋„"
        , COUNT(*) "์ธ์›์ˆ˜"
    FROM TBL_EMP
    GROUP BY TO_CHAR(HIREDATE, 'YYYY') --> '์ „์ฒด'๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— , EXTRACT(YEAR FROM HIREDATE) ์‚ฌ์šฉx
    ORDER BY 1;
    
    --** GROUP BY์™€ ์กฐ๊ฑด์— ๋ฐ์ดํ„ฐ ํƒ€์ž… ํ†ต์ผ
    --** GROUP BY ์—์„œ ๋ฌถ์–ด์ค€ ๋ฐฉ์‹์„ ํ†ต์ผ(EX. EXTRACT์ด๋ฉด, EXTRACT๋กœ)
    --** ๋‹จ์ˆœํžˆ ํ˜•์„ ๋งž์ถ˜๋‹ค๊ณ  ํ•ด์„œ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Œ

    2. ํ•จ์ˆ˜

    2.1. 

    2.2. 

    ํ•จ์ˆ˜ ์„ค๋ช… EX
    RANK() ๋“ฑ์ˆ˜(์ˆœ์œ„)๋ฅผ ๋ฐ˜ํ™˜ RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์ˆœ์œ„" -- 1,1,3
    PARTITION BY   RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) "๋ถ€์„œ๋ณ„๊ธ‰์—ฌ์ˆœ์œ„"
    DENSE_RANK() ์„œ์—ด์„ ๋ฐ˜ํ™˜ DENSE_RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์„œ์—ด" -- 1,1,2
    ํ•จ์ˆ˜ ์„ค๋ช… EX
    RANK() ๋“ฑ์ˆ˜(์ˆœ์œ„)๋ฅผ ๋ฐ˜ํ™˜ RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์ˆœ์œ„" -- 1,1,3
    PARTITION BY   RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) "๋ถ€์„œ๋ณ„๊ธ‰์—ฌ์ˆœ์œ„"
    DENSE_RANK() ์„œ์—ด์„ ๋ฐ˜ํ™˜ DENSE_RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์„œ์—ด" -- 1,1,2
    ํ•จ์ˆ˜ EX ๊ฒฐ๊ณผ ๋น„๊ณ 
    RANK() RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์ˆœ์œ„"  -- 1,1,3 ๋“ฑ์ˆ˜(์ˆœ์œ„)๋ฅผ ๋ฐ˜ํ™˜
    PARTITION BY RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) "๋ถ€์„œ๋ณ„๊ธ‰์—ฌ์ˆœ์œ„"    
    DENSE_RANK() DENSE_RANK() OVER(ORDER BY SAL DESC) "์ „์ฒด๊ธ‰์—ฌ์„œ์—ด"  -- 1,1,2 ์„œ์—ด์„ ๋ฐ˜ํ™˜
    LN() LN(95) 4.55387689160054083460978676511404117675 ์ž์—ฐ ๋กœ๊ทธ
    TRIM() TRIM('          TEST           ') "COL1" TEST  
    LTRIM() LTRIM('          TEST           ') "COL2" TEST          _  
    RTRIM() RTRIM('          TEST           ') "COL3" _         TEST  

    ๊ทธ๋ฃนํ•จ์ˆ˜ (ํŠน์ง•) ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๋“ค ์ค‘ NULL์ด ์กด์žฌํ•œ๋‹ค๋ฉด NULL์€ ์ œ์™ธํ•œ ์ƒํƒœ๋กœ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰

    ํ•จ์ˆ˜ EX ๊ฒฐ๊ณผ ๋น„๊ณ 
    SUM()     ํ•ฉ
    AVG()     ํ‰๊ท 
    COUNT() COUNT๋ฅผ ์ˆ˜ํ–‰ํ• ๋•Œ๋Š” NULL ์ด ์กฐํšŒ์—์„œ ๋น ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ (*)์œผ๋กœ ์กฐํšŒ   ์นด์šดํŠธ
    MAX()     ์ตœ๋Œ€๊ฐ’
    MIN()      ์ตœ์†Œ๊ฐ’
    VARIENCE()     ๋ถ„์‚ฐ
    STDDEV()     ํ‘œ์ค€ํŽธ์ฐจ