±×·ì(º¹¼öÇà Æ÷ÇÔ) ÇÔ¼ö

±×·ì ÇÔ¼ö¶õ

• ±×·ìÇÔ¼ö´Â ±×·ì´ç ÇϳªÀÇ °á°ú¸¦ Ãâ·ÂÇÏ´Â ÇÔ¼öÀÌ´Ù.
• ÀÌ·¯ÇÑ ±×·ìÇÔ¼ö´Â SELECT ÀýÀ̳ª HAVING Àý¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
• ¿©±â¼­ HAVING ÀýÀº ±×·ìÀ» Á¦ÇÑÇϴµ¥ »ç¿ëµÇ´Â Ű¿öµåÀÌ´Ù.
• GROUP BY ÀýÀº ÇàÀ» ±×·ìÈ­ÇÑ´Ù.


¡¼Çü½Ä¡½
	SELECT 	 Ä÷³¸í, ±×·ìÇÔ¼ö(Ä÷³¸í)
	FROM	 Å×À̺í¸í
	WHERE	 Á¶°Ç
	GROUP BY ±×·ìÇÎÇϰíÀÚÇÏ´Â Ä÷³¸í
	HAVING	 ±×·ìÁ¶°Ç
	ORDER BY Ä÷³¸í

• GROUP BY ÀýÀº SELECT Àý¿¡¼­ ±×·ìÇÔ¼ö¿Í °°ÀÌ ¾²ÀÎ ¸ðµç Ä÷³ÀÌ ±â¼úµÇ¾î¾ß ÇÑ´Ù.
• HAVING ÀýÀº ±×·ìÀ» Á¦ÇÑÇϱâ À§ÇÑ »çÇ×À» ±â¼úÇÑ´Ù.

±×·ì ÇÔ¼öÀÇ Á¾·ù

±×·ìÇÔ¼ö´Â ´ÙÀ½°ú °°Àº °ÍÀÌ ÀÖ´Ù.
ÇÔ¼ö¸í¼³¸í
AVGNULL°ªÀ» Á¦¿ÜÇÑ ÇàÀÇ Æò±Õ°ªÀ» Ãâ·ÂÇÑ´Ù.
COUNTÇàÀÇ °¹¼ö¸¦ ¸®ÅÏÇÑ´Ù.
GROUPINGÇØ´ç Ä÷³ÀÌ grouping¿¡ »ç¿ëµÇ¾ú´ÂÁöÀÇ ¿©ºÎ¸¦ 1 ¶Ç´Â 0À¸·Î Ãâ·ÂÇÑ´Ù.
GROUPING SETSÇÑ ¹øÀÇ Äõ¸®·Î ¿©·¯ °³ÀÇ groupingÀ» Á¦°øÇÑ´Ù.
MAXÃÖ´ë°ªÀ» Ãâ·ÂÇÑ´Ù.
MINÃÖ¼Ò°ªÀ» Ãâ·ÂÇÑ´Ù.
STDDEVNULL°ªÀ» Á¦¿ÜÇÑ Ç¥ÁØÆíÂ÷¸¦ Ãâ·ÂÇÑ´Ù.
SUMNULL°ªÀ» Á¦¿ÜÇÑ Çհ踦 Ãâ·ÂÇÑ´Ù.
VARIANCENULL°ªÀ» Á¦¿ÜÇÑ ºÐ»êÀ» Ãâ·ÂÇÑ´Ù.


GROUP BY Àý

• Å×À̺íÀÇ ÇàµéÀ» ¿øÇÏ´Â ±×·ìÀ¸·Î ³ª´­ ¶§ »ç¿ëµÇ´Â Ű¿öµåÀÌ´Ù.
• ±×·ìÇÔ¼öÀÇ Ä÷³¸íÀ» SELECT Àý¿¡ »ç¿ëÇϰíÀÚ ÇÏ´Â °æ¿ì, GROUP BY ´ÙÀ½¿¡ Ä÷³¸íÀ» Ãß°¡ÇÑ´Ù.
• WHERE ÀýÀ» »ç¿ëÇÏ¿© ÇàµéÀ» ±×·ìÀ¸·Î ³ª´©±â Àü¿¡ ¹Ì¸® Á¶°Ç¿¡ ¸ÂÁö ¾Ê´Â ÇàµéÀ» Á¦¿Ü½Ãų ¼ö ÀÖ´Ù.
• GROUP BY Àý¿¡ Ä÷³ÀÇ À§Ä¡ ¶Ç´Â Ä÷³ º°ÄªÀ» ÁÙ ¼ö ¾ø´Ù.
• ±âº»ÀûÀ¸·Î ÇàµéÀº ¿À¸§Â÷¼øÀ¸·Î Á¤·ÄµÇ¾î Ãâ·ÂµÈ´Ù. ORDER BYÀýÀ» »ç¿ëÇÏ¿© ¹Ù²Ù¾î ÁÙ ¼ö ÀÖ´Ù.
• ±×·ì ÇÔ¼ö°¡ ¾Æ´Ñ SELECT ÀýÀÇ ¾î¶² Ä÷³À̳ª Ç¥Çö½ÄÀº GROUP BY Àý¿¡ ¿Í¾ß ÇÑ´Ù.
• SELECT Àý¿¡¼­ ³ª¿­µÈ Ä÷³ À̸§À̳ª Ç¥Çö½ÄÀº GROUP BY Àý¿¡¼­ ¹Ýµå½Ã ¸í½ÃÇØ¾ß ÇÑ´Ù. ±×·¯³ª GROUP BY Àý¿¡¼­ ¸í½ÃÇÑ Ä÷³ À̸§Àº SELECT Àý¿¡¼­ ¸í½ÃÇÏÁö ¾Ê¾Æµµ µÈ´Ù.
• GROUP BY ÀýÀ» ÀÌ¿ëÇÏ¿© º¸´Ù ÀûÀº ±×·ìÀ¸·Î ºÐ·ùÇÏ¿© ó¸®ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.
• ROLLUPÀ̳ª CUBE ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© GROUPING(ÇÔ¼ö)ÇÑ °á°ú¿¡ ´ëÇÑ ÀÌÇØ¸¦ ½±°Ô ÇÑ´Ù.
• GROUPING SETS¿¡ ¿©·¯ °³ÀÇ ±×·ìÇÎ Á¶°ÇÀ» ±â¼úÇÏ¿© ¿øÇÏ´Â ±×·ìÇÎ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

¡¼Çü½Ä¡½
	SELECT 	 Ä÷³¸í, ±×·ìÇÔ¼ö(Ä÷³¸í), GROUPING(Ä÷³¸í)
	FROM	 Å×À̺í¸í
	WHERE	 Á¶°Ç
	GROUP BY [ROLLUP | CUBE]±×·ìÇÎÇϰíÀÚÇÏ´Â Ä÷³¸í,...
		 [GROUPING SETS (Ä÷³¸í, Ä÷³¸í,...), ...]
	HAVING	 ±×·ìÁ¶°Ç
	ORDER BY Ä÷³¸í ¶Ç´Â À§Ä¡¹øÈ£
¡¼¿¹Á¦¡½
SQL> select deptno, avg(sal)
  2  from emp
  3  group by deptno;
 
    DEPTNO   AVG(SAL)
---------- ----------
        10 2916.66667
        20       2175
        30       1400
 
SQL> select deptno, avg(sal),
  2         decode(sign(avg(sal)-2170),1, 'good','poor')
  3  from emp
  4  group by deptno;
 
    DEPTNO   AVG(SAL) DECO
---------- ---------- ----
        10 2916.66667 good
        20       2175 good
        30       1400 poor
 
SQL>
• GROUP BY Àý¿¡¼­ Çϳª ÀÌ»óÀÇ Ä÷³À» »ç¿ëÇÏ¿© ±×·ìÀ» ³ª´©°í, ±×·ìº°·Î ´Ù½Ã ¼­ºê ±×·ìÀ» ³ª´­ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ¿¹´Â deptnoº°·Î ±×·ìÀ» ³ª´©°í, ´Ù½Ã jobº°·Î ¼­ºê ±×·ìÀ» ³ª´« ¿¹ÀÌ´Ù.
SQL> select deptno,job,count(*),round(avg(sal))
  2  from emp
  3  group by deptno,job;
 
    DEPTNO JOB         COUNT(*) ROUND(AVG(SAL))
---------- --------- ---------- ---------------
        10 CLERK              1            1300
        10 MANAGER            1            2450
        10 PRESIDENT          1            5000
        20 CLERK              2             950
        20 ANALYST            2            3000
        20 MANAGER            1            2975
        30 CLERK              1             950
        30 MANAGER            1            2850
        30 SALESMAN           4            1400
 
9 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL> 

ROLLUP°ú CUBE

ROLLUP°ú CUBE´Â ±×·ìÇÎ Á¶ÇÕÀ» ¸¸µé¾î ³»´Â ¿¬»êÀÚÀÌ´Ù.
ROLLUPÀº GROUP BY ÀýÀÇ ±×·ì Á¶°Ç¿¡ µû¶ó Àüü ÇàÀ» ±×·ìÈ­ Çϰí, °¢ ±×·ì¿¡ ´ëÇØ ºÎºÐÇÕÀ» ±¸ÇÏ´Â ¿¬»êÀÚÀÌ´Ù.
CUBE´Â ROLLUP¿¡ ÀÇÇÑ ±×·ì °á°ú¿Í GROUP BY Àý¿¡ ±â¼úµÈ Á¶°Ç¿¡ µû¶ó ±×·ì Á¶ÇÕÀ» ¸¸µå´Â ¿¬»êÀÚÀÌ´Ù. Áï, ROLLUP ¿¬»êÀÚ¸¦ ¼öÇàÇÑ °á°ú¿¡ ´õÇØ GROUP BY Àý¿¡ ±â¼úµÈ Á¶°Ç¿¡ µû¶ó ¸ðµç °¡´ÉÇÑ ±×·ìÇÎ Á¶ÇÕ¿¡ ´ëÇÑ °á°ú¸¦ Ãâ·ÂÇÑ´Ù.

¡¼Çü½Ä¡½
	SELECT 	 Ä÷³¸í, ±×·ìÇÔ¼ö(Ä÷³¸í)
	FROM	 Å×À̺í¸í
	WHERE	 Á¶°Ç
	GROUP BY [ROLLUP | CUBE]±×·ìÇÎÇϰíÀÚÇÏ´Â Ä÷³¸í,...
	HAVING	 ±×·ìÁ¶°Ç
	ORDER BY Ä÷³¸í ¶Ç´Â À§Ä¡¹øÈ£
• ROLLUP°ú CUBE´Â GROUP BY Àý µÚ¿¡ ±â¼úÇÑ Ä÷³ °³¼ö¿¡ µû¶ó Ãâ·ÂµÇ´Â °á°ú ¼ÂÀÌ ´Þ¶óÁø´Ù.
• GROUP BY µÚ¿¡ ±â¼úÇÑ Ä÷³ÀÌ 2°³ÀÏ °æ¿ì ROLLUPÀº n+1¿¡¼­ 3°³ÀÇ ±×·ìº° °á°ú°¡ Ãâ·ÂµÇ°í, CUBE´Â 2*n¿¡¼­ 2*2=4°³ÀÇ °á°ú ¼ÂÀÌ Ãâ·ÂµÈ´Ù.

ROLLUPÀÇ °³³äµµ
¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ROLLUP ¦¬¦¬¦¬¦¬¦¬¦¬¦¬>
deptnoclerksalesmanmanageranalystpresident°è
101  1  13
202  12  5
30141    6

CUBEÀÇ °³³äµµ
¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ CUBE ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¯
deptnoclerksalesmanmanageranalystpresident°è¦­
¦­
¦­
¦­
¦­
¦­
101  1  13
202  12  5
30141    6
°è4432114

¡¼¿¹Á¦¡½
deptnoº° ¸ðÀ½jobº° ¸ðÀ½ºÎºÐÇÕ°è
SQL> select deptno,job,sal from emp 
  2  order by deptno;
 
    DEPTNO JOB              SAL
---------- --------- ----------
        10 MANAGER         2450
        10 PRESIDENT       5000
        10 CLERK           1300
        20 CLERK            800
        20 CLERK           1100
        20 ANALYST         3000
        20 ANALYST         3000
        20 MANAGER         2975
        30 SALESMAN        1600
        30 MANAGER         2850
        30 SALESMAN        1250
        30 CLERK            950
        30 SALESMAN        1500
        30 SALESMAN        1250
 
14 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL>
SQL> select deptno,job,sal from emp
  2  order by job;
 
    DEPTNO JOB              SAL
---------- --------- ----------
        20 ANALYST         3000
        20 ANALYST         3000
        20 CLERK            800
        20 CLERK           1100
        10 CLERK           1300
        30 CLERK            950
        20 MANAGER         2975
        10 MANAGER         2450
        30 MANAGER         2850
        10 PRESIDENT       5000
        30 SALESMAN        1600
        30 SALESMAN        1250
        30 SALESMAN        1500
        30 SALESMAN        1250
 
14 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL>
SQL> select deptno,sum(sal)
  2  from emp
  3  group by rollup(deptno);
 
    DEPTNO   SUM(SAL)
---------- ----------
        10       8750
        20      10875
        30       9400
                29025
 
SQL>
SQL> select job,sum(sal) from emp
  2  group by rollup(job);
 
JOB         SUM(SAL)
--------- ----------
ANALYST         6000
CLERK           4150
MANAGER         8275
PRESIDENT       5000
SALESMAN        5600
               29025
 
SQL>

ROLLUP(deptno,job)ÀÇ °³³äµµ
¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ ROLLUP ¦¬¦¬¦¬¦¬¦¬¦¬¦¬>
deptnoclerksalesmanmanageranalystpresident°è
101  1  13
ÇÕÇÕÇÕÇÕÇÕ
202  12  5
ÇÕÇÕÇÕÇÕÇÕ
30141    6
ÇÕÇÕÇÕÇÕÇÕ

CUBE(deptno,job)ÀÇ °³³äµµ
¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ CUBE ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¯
deptnoclerksalesmanmanageranalystpresident°è ¦­
¦­
¦­
¦­
¦­
¦­
¦­
¦­
¦­
¦­
101  1  13
ÇÕÇÕÇÕÇÕÇÕ
202  12  5
ÇÕÇÕÇÕÇÕÇÕ
30141    6
ÇÕÇÕÇÕÇÕÇÕ
°è4432114

¡¼¿¹Á¦¡½
ROLLUP »ç¿ëCUBE »ç¿ë
SQL> select deptno,job,sum(sal)
  2  from emp
  3  group by rollup(deptno,job);
 
    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        10 CLERK           1300 ¢Ð 10 ±×·ì clerkÀÇ ÇÕ°è
        10 MANAGER         2450 ¢Ð 10 ±×·ì managerÀÇ ÇÕ°è
        10 PRESIDENT       5000 ¢Ð 10 ±×·ì presidentÀÇ ÇÕ°è
        10                 8750  ¢Ð 10 ±×·ìÀÇ ºÎºÐÇÕ°è
        20 CLERK           1900 ¢Ð 20 ±×·ì clerkÀÇ ÇÕ°è
        20 ANALYST         6000 ¢Ð 20 ±×·ì analystÀÇ ÇÕ°è
        20 MANAGER         2975 ¢Ð 20 ±×·ì managerÀÇ ÇÕ°è
        20                10875  ¢Ð 20 ±×·ìÀÇ ºÎºÐÇÕ°è
        30 CLERK            950 ¢Ð 30 ±×·ì clerkÀÇ ÇÕ°è
        30 MANAGER         2850 ¢Ð 30 ±×·ì managerÀÇ ÇÕ°è
        30 SALESMAN        5600 ¢Ð 30 ±×·ì salesmanÀÇ ÇÕ°è
        30                 9400  ¢Ð 30 ±×·ìÀÇ ºÎºÐÇÕ°è
                          29025  ¢Ð ÃÑÇÕ°è
 
13 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL>
 
SQL> select deptno,job,sum(sal)
  2  from emp
  3  group by cube(deptno,job);
 
    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
                          29025  ¢Ð ÃÑÇÕ°è
           CLERK           4150  ¢Ð CLERK ±×·ìÀÇ ÇÕ°è
           ANALYST         6000  ¢Ð ANALYST ±×·ìÀÇ ÇÕ°è
           MANAGER         8275  ¢Ð MANAGER ±×·ìÀÇ ÇÕ°è
           SALESMAN        5600  ¢Ð SALESMAN ±×·ìÀÇ ÇÕ°è
           PRESIDENT       5000  ¢Ð PRESIDENT ±×·ìÀÇ ÇÕ°è
        10                 8750  ¢Ð 10 ±×·ìÀÇ ºÎºÐÇÕ°è
        10 CLERK           1300 ¢Ð 10 ±×·ì clerkÀÇ ÇÕ°è
        10 MANAGER         2450 ¢Ð 10 ±×·ì managerÀÇ ÇÕ°è
        10 PRESIDENT       5000 ¢Ð 10 ±×·ì presidentÀÇ ÇÕ°è
        20                10875  ¢Ð 20 ±×·ìÀÇ ºÎºÐÇÕ°è
        20 CLERK           1900 ¢Ð 20 ±×·ì clerkÀÇ ÇÕ°è
        20 ANALYST         6000 ¢Ð 20 ±×·ì analystÀÇ ÇÕ°è
        20 MANAGER         2975 ¢Ð 20 ±×·ì managerÀÇ ÇÕ°è
        30                 9400  ¢Ð 30 ±×·ìÀÇ ºÎºÐÇÕ°è
        30 CLERK            950 ¢Ð 30 ±×·ì clerkÀÇ ÇÕ°è
        30 MANAGER         2850 ¢Ð 30 ±×·ì managerÀÇ ÇÕ°è
        30 SALESMAN        5600 ¢Ð 30 ±×·ì salesmanÀÇ ÇÕ°è
 
18 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL> 

À§ ¿¹Á¦¿¡¼­ rollup(deptno,job)À̳ª cube(deptno,job)ó·³ µÎ °³¿¡ ´ëÇØ¼­ ºÐ¼®ÇÏ´Â °æ¿ì¿¡´Â ºÎºÐÇհ踦 ¼¼ºÎÀûÀ¸·Î °è»êÇÑ´Ù. scott.emp ½ºÅ°¸¶¿¡¼­ deptno=20ÀÇ clerk=2¸í, analyst=2¸íÀÌ°í ¶ÇÇÑ deptno=30 ±×·ì¿¡¼­´Â salesman=4¸íÀÌ µÈ´Ù. ±×µé¿¡ ´ëÇÑ °¢°¢ÀÇ ºÎºÐÇÕÀÌ °è»êµÇ¾î Áø´Ù.


GROUPING ÇÔ¼ö

GROUPING ÇÔ¼ö´Â ROLLUPÀ̳ª CUBE ¿¬»êÀÚ¿Í ÇÔ²² »ç¿ëÇÏ¿© GROUPING ÇÔ¼ö¿¡ ±â¼úµÈ Ä÷³ÀÌ ±×·ìÇÎ ½Ã Áï, ROLLUPÀ̳ª CUBE ¿¬»ê½Ã »ç¿ëÀÌ µÇ¾ú´ÂÁö¸¦ º¸¿© ÁÖ´Â ÇÔ¼öÀÌ´Ù.
Ưº°È÷ ¿¬»ê ±â´ÉÀº ¾øÀ¸¸ç ROLLUPÀ̳ª CUBE ¿¬»ê ÈÄ Ãâ·ÂµÈ °á°ú¿¡ ´ëÇÑ »ç¿ëÀÚÀÇ ÀÌÇØ¸¦ ³ôÀ̱â À§ÇØ »ç¿ëµÈ´Ù.
Áï, GROUPING ÇÔ¼ö¸¦ ÀÌ¿ëÇÒ °æ¿ì Ãâ·ÂµÇ´Â °á°ú°ª Áß NULL°ªÀÌ ÀÖ´Ù¸é ÀÌ NULL°ªÀÌ ROLLUPÀ̳ª CUBE ¿¬»êÀÇ °á°ú·Î »ý¼ºµÈ °ÍÀÎÁö, ¿ø·¡ Å×À̺í»ó¿¡ NULL°ªÀ¸·Î ÀúÀåµÈ °ÍÀÎÁö¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù.

¡¼Çü½Ä¡½
	SELECT 	 Ä÷³¸í, ±×·ìÇÔ¼ö(Ä÷³¸í),GROUPING(Ä÷³¸í)
	FROM	 Å×À̺í¸í
	WHERE	 Á¶°Ç
	GROUP BY [ROLLUP | CUBE]±×·ìÇÎÇϰíÀÚÇÏ´Â Ä÷³¸í,...
	HAVING	 ±×·ìÁ¶°Ç
	ORDER BY Ä÷³¸í ¶Ç´Â À§Ä¡¹øÈ£
• grouping ÇÔ¼ö´Â Àμö ·Î ÇϳªÀÇ °ª¸¸À» °¡Áú ¼ö ÀÖ´Ù.
• grouping ÇÔ¼ö¿¡ »ç¿ëµÈ Àμö´Â GROUP BY Àý¿¡ ±â¼úµÈ °ªÁß¿¡ Çϳª¿Í ¹Ýµå½Ã ÀÏÄ¡µÇ¾î¾ß ÇÑ´Ù.
• GROUPING ÇÔ¼ö´Â °á°ú°ªÀ¸·Î 0 ¶Ç´Â 1À» ¸®ÅÏÇÑ´Ù. 0°ªÀ» ¸®ÅÏÇÏ´Â °æ¿ì, ÇØ´ç Àμö·Î ¾²ÀÎ °ªÀÌ ROLLUPÀ̳ª CUBE ¿¬»ê½Ã »ç¿ëµÇ¾î Á³À½À» ³ªÅ¸³»´Â °ÍÀ̰í, 1°ªÀ» ¸®ÅÏÇÏ´Â °æ¿ì ROLLUPÀ̳ª CUBE ¿¬»ê½Ã »ç¿ëµÇ¾î ÁöÁö ¾Ê¾ÒÀ½À» ³ªÅ¸³½´Ù.
¡¼¿¹Á¦¡½
ROLLUP »ç¿ëCUBE »ç¿ë
SQL> select deptno,sum(sal),grouping(deptno)
  2  from emp
  3  group by rollup(deptno);
 
    DEPTNO   SUM(SAL) GROUPING(DEPTNO)
---------- ---------- ----------------
        10       8750                0
        20      10875                0
        30       5600                0
                25225                1

SQL>
 
SQL> select deptno,sum(sal),grouping(deptno)
  2  from emp
  3  group by cube(deptno);
 
    DEPTNO   SUM(SAL) GROUPING(DEPTNO)
---------- ---------- ----------------
                25225                1
        10       8750                0
        20      10875                0
        30       5600                0
 
SQL>
 ¡¼¿¹Á¦¡½
ROLLUP »ç¿ëCUBE »ç¿ë
SQL> select deptno,job,count(*),
  2    grouping(deptno) grp_dno,
  3    grouping(job) grp_job
  4  from emp
  5  group by rollup(deptno,job);
 
    DEPTNO JOB         COUNT(*)    GRP_DNO    GRP_JOB
---------- --------- ---------- ---------- ----------
        10 CLERK              1          0          0
        10 MANAGER            1          0          0
        10 PRESIDENT          1          0          0
        10                    3          0          1
        20 CLERK              2          0          0
        20 ANALYST            2          0          0
        20 MANAGER            1          0          0
        20                    5          0          1
        30 CLERK              1          0          0
        30 MANAGER            1          0          0
        30 SALESMAN           4          0          0
        30                    6          0          1
                             14          1          1
 
13 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL>
SQL> select deptno,job,count(*),
  2    grouping(deptno) grp_dno,
  3     grouping(job) grp_job
  4  from emp
  5  group by cube(deptno,job);
 
    DEPTNO JOB         COUNT(*)    GRP_DNO    GRP_JOB
---------- --------- ---------- ---------- ----------
                             14          1          1
           CLERK              4          1          0
           ANALYST            2          1          0
           MANAGER            3          1          0
           SALESMAN           4          1          0
           PRESIDENT          1          1          0
        10                    3          0          1
        10 CLERK              1          0          0
        10 MANAGER            1          0          0
        10 PRESIDENT          1          0          0
        20                    5          0          1
        20 CLERK              2          0          0
        20 ANALYST            2          0          0
        20 MANAGER            1          0          0
        30                    6          0          1
        30 CLERK              1          0          0
        30 MANAGER            1          0          0
        30 SALESMAN           4          0          0
 
18 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL>

GROUPING SETS ÇÔ¼ö

grouping sets ÇÔ¼ö´Â GROUP BY Àý¿¡¼­ ±×·ì Á¶°ÇÀ» ¿©·¯ °³ ÁöÁ¤ÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀÌ´Ù. GROUPING SETS ÇÔ¼öÀÇ °á°ú´Â °¢ ±×·ì Á¶°Ç¿¡ ´ëÇØ º°µµ·Î GROUP BYÇÑ °á°ú¸¦ UNION ALLÇÑ °á°ú¿Í µ¿ÀÏÇÏ´Ù. GROUPING SETS ÇÔ¼ö´Â ÇϳªÀÇ SQL¹®¿¡ ÀÇÇØ ¿©·¯ °³ÀÇ ±×·ì Á¶°ÇÀ» ÇѲ¨¹ø¿¡ ÁöÁ¤ÇÏ¿© º¹ÀâÇÑ ±×·ì ó¸® °úÁ¤À» ´Ü¼øÇÏ°Ô ±¸¼ºÇÒ ¼ö ÀÖ´Ù.

¡¼Çü½Ä¡½
	SELECT 	 Ä÷³¸í, ±×·ìÇÔ¼ö(Ä÷³¸í),GROUPING(Ä÷³¸í)
	FROM	 Å×À̺í¸í
	WHERE	 Á¶°Ç
	GROUP BY [ROLLUP | CUBE]±×·ìÇÎÇϰíÀÚÇÏ´Â Ä÷³¸í,...
		 [GROUPING SETS (Ä÷³¸í, Ä÷³¸í,...), ...]
	HAVING	 ±×·ìÁ¶°Ç
	ORDER BY Ä÷³¸í ¶Ç´Â À§Ä¡¹øÈ£
• grouping sets ÇÔ¼ö¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â Àμö´Â ¿©·¯ °³°¡ ¿Ã ¼ö ÀÖ´Ù.
¡¼¿¹Á¦¡½
grouping sets¸¦ »ç¿ëÇÑ °æ¿ìUNION ALLÀ» »ç¿ëÇÑ °æ¿ì
SQL> select deptno,job,mgr,sum(sal)
  2  from emp
  3  group by GROUPING SETS((deptno,job),(deptno,mgr));
 
    DEPTNO JOB              MGR   SUM(SAL)
---------- --------- ---------- ----------
        10                            5000
        10                 7782       1300
        10                 7839       2450
        20                 7566       6000
        20                 7788       1100
        20                 7839       2975
        20                 7902        800
        30                 7698       5600
        10 CLERK                      1300
        10 MANAGER                    2450
        10 PRESIDENT                  5000
 
    DEPTNO JOB              MGR   SUM(SAL)
---------- --------- ---------- ----------
        20 CLERK                      1900
        20 ANALYST                    6000
        20 MANAGER                    2975
        30 SALEMAN                    5600
 
15 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL>
 
SQL> select deptno,job,null as mgr,sum(sal)
  2  from emp
  3  group by deptno,job
  4  UNION ALL
  5  select deptno,null as JOB,mgr,sum(sal)
  6  from emp
  7  group by deptno,mgr;
 
    DEPTNO JOB              MGR   SUM(SAL)
---------- --------- ---------- ----------
        10 CLERK                      1300
        10 MANAGER                    2450
        10 PRESIDENT                  5000
        20 CLERK                      1900
        20 ANALYST                    6000
        20 MANAGER                    2975
        30 SALEMAN                    5600
        10                            5000
        10                 7782       1300
        10                 7839       2450
        20                 7566       6000
 
    DEPTNO JOB              MGR   SUM(SAL)
---------- --------- ---------- ----------
        20                 7788       1100
        20                 7839       2975
        20                 7902        800
        30                 7698       5600
 
15 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù.
 
SQL>

¡¼¿¹Á¦¡½ SQL> select deptno,job,count(*) 2 from emp 3 group by grouping sets((deptno,job),deptno,job); DEPTNO JOB COUNT(*) ---------- --------- ---------- 10 CLERK 1 20 CLERK 2 30 CLERK 1 20 ANALYST 2 10 MANAGER 1 20 MANAGER 1 30 MANAGER 1 30 SALESMAN 4 10 PRESIDENT 1 CLERK 4 ANALYST 2 MANAGER 3 SALESMAN 4 PRESIDENT 1 10 3 20 5 30 6 17 °³ÀÇ ÇàÀÌ ¼±ÅõǾú½À´Ï´Ù. SQL>


HAVING

HAVING ÀýÀº SELECT ¹®¿¡¼­ Á¶°Ç °Ë»öÀ» À§ÇØ »ç¿ëµÇ´Â WHERE ÀýÀÇ ±â´É°ú ºñ½ÁÇÏ´Ù. WHERE ÀýÀº FROM Àý¿¡¼­ ÁöÁ¤µÈ Å×À̺íÀ» ´ë»óÀ¸·Î Á¶°ÇÀ» Àû¿ëÇϴµ¥ ºñÇÏ¿©, HAVING ÀýÀº GROUP BY Àý¿¡ ÀÇÇØ »ý¼ºµÈ ±×·ìÀ» ´ë»óÀ¸·Î Á¶°ÇÀ» Àû¿ëÇÑ´Ù.

HAVING ÀýÀÇ ½ÇÇà °úÁ¤
1) Å×ÀÌºí¿¡¼­ WHERE Àý¿¡ ÀÇÇØ Á¶°ÇÀ» ¸¸Á·ÇÏ´Â Çà ÁýÇÕÀ» ¼±ÅÃÇÑ´Ù.
2) Çà ÁýÇÕÀ» GROUP BY Àý¿¡ ÀÇÇØ ±×·ìÇÎÇÑ´Ù.
3) HAVING Àý¿¡ ÀÇÇØ Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ±×·ìÀ» ¼±ÅÃÇÑ´Ù.

• ±×·ìÀ» Á¦ÇÑÇÑ´Ù.
• WHERE Àý¿¡ ±×·ì Á¦ÇÑ¿¡ ´ëÇÑ Á¶°ÇÀ» ÁÖ¸é error°¡ ¹ß»ýÇÑ´Ù.

¡¼¿¹Á¦¡½
SQL> select deptno, count(*), sum(sal)
  2  from emp
  3  group by deptno
  4  having count(*) > 2;
 
    DEPTNO   COUNT(*)   SUM(SAL)
---------- ---------- ----------
        10          3       8750
        20          5      10875
        30          4       5600
 
SQL> 
• HAVING Àý ´ÙÀ½¿¡ GROUP ÇÔ¼ö³ª GROUP BY ÇÑ °Í¸¸ ¿Ã ¼ö ÀÖ´Ù.
• SELECT ¹®ÀåÀº SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY¼øÀ¸·Î ±¸¼ºµÈ´Ù.
• HAVING ÀýÀº GROUP BY Àý ¾Õ¿¡µµ ¿Ã ¼ö ÀÖÁö¸¸, À§¿¡ ¸í½ÃÇÑ ¼ø¼­¸¦ ±ÇÀåÇÑ´Ù.
¡¼¿¹Á¦¡½
having Àý ¾ø´Â °æ¿ìhaving Àý ÀÖ´Â °æ¿ì
SQL> select job,count(*), round(avg(sal)) avg_sal,
  2     round(avg(comm)) avg_comm
  3  from emp
  4  group by job
  5  order by avg_sal DESC;
 
JOB         COUNT(*)    AVG_SAL   AVG_COMM
--------- ---------- ---------- ----------
PRESIDENT          1       5000
ANALYST            2       3000
MANAGER            3       2758
SALESMAN           4       1400        550
CLERK              4       1038

SQL>
 
SQL> select job,count(*), round(avg(sal)) avg_sal,
  2     round(avg(comm)) avg_comm
  3  from emp
  4  group by job
  5  having count(*) >= 1
  6  order by avg_sal DESC;
 
JOB         COUNT(*)    AVG_SAL   AVG_COMM
--------- ---------- ---------- ----------
PRESIDENT          1       5000
ANALYST            2       3000
MANAGER            3       2758
SALESMAN           4       1400        550
CLERK              4       1038
 
SQL>
WHERE Àý¿¡ ÀÇÇØ ±×·ìÈ­ °úÁ¤¿¡ ºÒÇÊ¿äÇÑ ÇàÀ» ¹Ì¸® Á¦¿ÜÇÑ ÈÄ¿¡ GROUP BY ÀýÀ» ½ÇÇàÇϹǷΠ³»ºÎ Á¤·Ä¿¡ ÇÊ¿äÇÑ ÇàÀÇ ¼öÀ» ÁÙ¿© ÁֹǷΠȿÀ²ÀûÀÓ GROUP BY Àý¿¡ ÀÇÇØ Àüü Çà ÁýÇÕÀ» ¸ÕÀú Á¤·ÄÇÑ ÈÄ¿¡ HAVING ÀýÀ» Àû¿ëÇϹǷΠºñÈ¿À²ÀûÀÓ