oracle 中 rollup、cube、grouping 使用详解 -- 使用oracle 样例表演示

  1. -- 使用oracle 的样列库,演示 rollup, cube, grouping 的用法与使用场景  
  2.   
  3. --- ROLLUP , 为了理解分组的成员数量,我增加了 分组的计数  COUNT(SAL)  
  4.   SELECT   E1.DEPTNO,  
  5.            JOB,  
  6.            TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD'),  
  7.            SUM (SAL),  
  8.            COUNT (SAL)  
  9.     FROM   emp e1  
  10. GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE);  
  11.   
  12. /*  
  13. 分组情况为:  
  14. DEPTNO,job,HIREDATE   第 1 种分组  (A,B,C)   
  15. DEPTNO,job,           第 2 种分组  (A,B)    
  16. DEPTNO                 第 3 种分组  (A)    
  17.                        总分一个组  
  18.                          
  19. -- 结果如下:  并进行部分数据解释,以便读者理解  
  20.     DEPTNO JOB       TO_CHAR(E1   SUM(SAL) COUNT(SAL)  
  21. ---------- --------- ---------- ---------- ----------  
  22.         10 CLERK     1982-01-23       1300          1   (A,B,C)  -- 10号部门,CLERK工种,入职日期为1982-01-23,只有一个成员 工资和为:1300  
  23.         10 CLERK                      1300          1   (A,B)    -- 10号部门,CLERK工种,只有一个成员 工资和为:1300  
  24.         10 MANAGER   1981-06-09       2450          1   (A,B,C)  -- 与第一条记录相似的分析   
  25.         10 MANAGER                    2450          1   (A,B)  
  26.         10 PRESIDENT 1981-11-17       5000          1   (A,B,C)    
  27.         10 PRESIDENT                  5000          1   (A,B,C)  
  28.         10                            8750          3   (A)      -- 10号部门有3个成员,工资总计为8750  
  29.         20 CLERK     1980-12-17        800          1  
  30.         20 CLERK                       800          1  
  31.         20 ANALYST   1981-12-03       3000          1  
  32.         20 ANALYST                    3000          1  
  33.         20 MANAGER   1981-04-02       2975          1  
  34.         20 MANAGER                    2975          1  
  35.         20                            6775          3  
  36.         30 CLERK     1981-12-03        950          1  
  37.         30 CLERK                       950          1  
  38.         30 MANAGER   1981-05-01       2850          1  
  39.         30 MANAGER                    2850          1  
  40.         30 SALESMAN  1981-02-20       1600          1  
  41.         30 SALESMAN  1981-02-22       1250          1  
  42.         30 SALESMAN  1981-09-08       1500          1  
  43.         30 SALESMAN  1981-09-28       1250          1  
  44.         30 SALESMAN                   5600          4    (A,B)    -- 30号部门,SALESMAN工种,有4个成员 工资和为:5600   
  45.         30                            9400          6    (A)      -- 30号部 有6个成员, 工资总计为:9400   
  46.                                      24925         12     ()      -- 所有部门工资总和为:24925                          
  47. */  
  48.   
  49.   
  50. --- CUBE , 为了理解分组的成员数量,我增加了 分组的计数  COUNT(SAL)  
  51.   SELECT   E1.DEPTNO,  
  52.            JOB,  
  53.            TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD'),  
  54.            SUM (SAL),  
  55.            COUNT (SAL)  
  56.     FROM   emp e1  
  57. GROUP BY   CUBE (E1.DEPTNO, E1.JOB, E1.HIREDATE);  
  58.   
  59. /*  
  60. 分组原则:  
  61. GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。  
  62.   
  63. -- 结果 :  并进行部分数据解释,以便读者理解  
  64.     DEPTNO JOB       TO_CHAR(E1   SUM(SAL) COUNT(SAL)  
  65. ---------- --------- ---------- ---------- ----------  
  66.                                      24925         12   -- 全表分组,工资总合:24925   
  67.                      1980-12-17        800          1     
  68.                      1981-02-20       1600          1  
  69.                      1981-02-22       1250          1  
  70.                      1981-04-02       2975          1  
  71.                      1981-05-01       2850          1  
  72.                      1981-06-09       2450          1  
  73.                      1981-09-08       1500          1  
  74.                      1981-09-28       1250          1  
  75.                      1981-11-17       5000          1  
  76.                      1981-12-03       3950          2   (C)  1981-12-03 入职的有2位员工,工资总计3950  
  77.                      1982-01-23       1300          1  
  78.            CLERK                      3050          3   (B) CLERK 工种,共计有3位员工,工资总计:3050  
  79.            CLERK     1980-12-17        800          1  
  80.            CLERK     1981-12-03        950          1  
  81.            CLERK     1982-01-23       1300          1  
  82.            ANALYST                    3000          1  
  83.            ANALYST   1981-12-03       3000          1  
  84.            MANAGER                    8275          3  
  85.            MANAGER   1981-04-02       2975          1  
  86.            MANAGER   1981-05-01       2850          1  
  87.            MANAGER   1981-06-09       2450          1  
  88.            SALESMAN                   5600          4  
  89.            SALESMAN  1981-02-20       1600          1  
  90.            SALESMAN  1981-02-22       1250          1  
  91.            SALESMAN  1981-09-08       1500          1  
  92.            SALESMAN  1981-09-28       1250          1  
  93.            PRESIDENT                  5000          1  
  94.            PRESIDENT 1981-11-17       5000          1  
  95.         10                            8750          3  
  96.         10           1981-06-09       2450          1  
  97.         10           1981-11-17       5000          1  
  98.         10           1982-01-23       1300          1  
  99.         10 CLERK                      1300          1  
  100.         10 CLERK     1982-01-23       1300          1  
  101.         10 MANAGER                    2450          1  
  102.         10 MANAGER   1981-06-09       2450          1  
  103.         10 PRESIDENT                  5000          1  
  104.         10 PRESIDENT 1981-11-17       5000          1  
  105.         20                            6775          3  (A) -- 20号部 有3个成员, 工资总计为:6775   
  106.         20           1980-12-17        800          1  
  107.         20           1981-04-02       2975          1  
  108.         20           1981-12-03       3000          1  
  109.         20 CLERK                       800          1  
  110.         20 CLERK     1980-12-17        800          1  
  111.         20 ANALYST                    3000          1  
  112.         20 ANALYST   1981-12-03       3000          1  
  113.         20 MANAGER                    2975          1  
  114.         20 MANAGER   1981-04-02       2975          1  
  115.         30                            9400          6  (A) -- 30号部 有6个成员, 工资总计为:9400   
  116.         30           1981-02-20       1600          1  
  117.         30           1981-02-22       1250          1  
  118.         30           1981-05-01       2850          1  
  119.         30           1981-09-08       1500          1  
  120.         30           1981-09-28       1250          1  
  121.         30           1981-12-03        950          1  
  122.         30 CLERK                       950          1  
  123.         30 CLERK     1981-12-03        950          1  
  124.         30 MANAGER                    2850          1  
  125.         30 MANAGER   1981-05-01       2850          1  
  126.         30 SALESMAN                   5600          4  (A、B) 30号部门,  SALESMAN 工种,有4 个成员,工资总计:5600  
  127.         30 SALESMAN  1981-02-20       1600          1    
  128.         30 SALESMAN  1981-02-22       1250          1  
  129.         30 SALESMAN  1981-09-08       1500          1  (A、B、C)  0号部门,  SALESMAN 工种,1981-09-08入职,1 个员工,工资总计:1500  
  130.         30 SALESMAN  1981-09-28       1250          1  (A、B、C)  0号部门,  SALESMAN 工种,1981-09-28入职,1 个员工,工资总计:1250  
  131.   
  132. 已选择65行。  
  133. */  
  134.   
  135. --- GROUPING函数  
  136. /*  
  137. GROUPING 是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。  
  138. 仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。  
  139.   
  140. 语法:  GROUPING ( column_name )  
  141.   
  142. 是 GROUP BY 子句中用于检查 CUBE 或 ROLLUP 空值的列。  
  143.   
  144. 返回类型: int  
  145.   
  146. 分组用于区分由 CUBE 和 ROLLUP 返回的空值和标准的空值。作为CUBE 或 ROLLUP 操作结果返回的 NULL 是 NULL 的特殊应用。它在结果集内作为列的占位符,意思是"全体"。  
  147. */  
  148.   
  149. -- grouping 样列  
  150.   SELECT   E1.DEPTNO,  
  151.            JOB,  
  152.            TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD') HIREDATE,  
  153.            SUM (SAL),  
  154.            COUNT (SAL),  
  155.            GROUPING (E1.DEPTNO) d,  
  156.            GROUPING (JOB) j,  
  157.            GROUPING (E1.HIREDATE) h  
  158.     FROM   emp e1  
  159. GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE);  
  160.   
  161.   
  162.   
  163. /*  
  164. -- 结果 :  并进行部分数据解释,以便读者理解  
  165.   
  166.     DEPTNO JOB       HIREDATE     SUM(SAL) COUNT(SAL)   D   J   H  
  167. ---------- --------- ---------- ---------- ---------- --- --- ---  
  168.         10 CLERK     1982-01-23       1300          1   0   0   0   所有列都有数据作为分组,所以全为 0  
  169.         10 CLERK                      1300          1   0   0   1   DEPTNO JOB列 有数据,而HIREDATE没有数据,所以 H 列产生的值为:1  
  170.         10 MANAGER   1981-06-09       2450          1   0   0   0      
  171.         10 MANAGER                    2450          1   0   0   1  
  172.         10 PRESIDENT 1981-11-17       5000          1   0   0   0  
  173.         10 PRESIDENT                  5000          1   0   0   1  
  174.         10                            8750          3   0   1   1  
  175.         20 CLERK     1980-12-17        800          1   0   0   0  
  176.         20 CLERK                       800          1   0   0   1  
  177.         20 ANALYST   1981-12-03       3000          1   0   0   0  
  178.         20 ANALYST                    3000          1   0   0   1  
  179.         20 MANAGER   1981-04-02       2975          1   0   0   0  
  180.         20 MANAGER                    2975          1   0   0   1  
  181.         20                            6775          3   0   1   1  
  182.         30 CLERK     1981-12-03        950          1   0   0   0  
  183.         30 CLERK                       950          1   0   0   1  
  184.         30 MANAGER   1981-05-01       2850          1   0   0   0  
  185.         30 MANAGER                    2850          1   0   0   1  
  186.         30 SALESMAN  1981-02-20       1600          1   0   0   0  
  187.         30 SALESMAN  1981-02-22       1250          1   0   0   0  
  188.         30 SALESMAN  1981-09-08       1500          1   0   0   0  
  189.         30 SALESMAN  1981-09-28       1250          1   0   0   0  
  190.         30 SALESMAN                   5600          4   0   0   1  
  191.         30                            9400          6   0   1   1  
  192.                                      24925         12   1   1   1     
  193. */  
  194.   
  195.   
  196. -- 应用 grouping    
  197. SELECT   CASE  
  198.               WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 0 AND GROUPING (HIREDATE) = 0)  
  199.                    THEN DEPTNO|| ' '|| JOB|| ' ' || TO_CHAR (HIREDATE, 'YYYY-MM-DD')|| ' subtotal:'  
  200.               WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 0 AND GROUPING (HIREDATE) = 1)  
  201.                    THEN DEPTNO || ' ' || JOB || ' subtotal:'  
  202.               WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 1 AND GROUPING (HIREDATE) = 1)  
  203.                    THEN DEPTNO || ' subtotal:'  
  204.               WHEN (    GROUPING (E1.DEPTNO) = 1 AND GROUPING (JOB) = 1 AND GROUPING (HIREDATE) = 1)  
  205.                    THEN 'Total:'  
  206.            END  
  207.               "Total",   
  208.            SUM (SAL), COUNT (SAL)  
  209.     FROM   emp e1  
  210. GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE);  
  211.   
  212. -- 结果如下:  
  213. /*  
  214. Total                                  SUM(SAL) COUNT(SAL)  
  215. ------------------------------------ ---------- ----------  
  216. 10 CLERK 1982-01-23 subtotal:              1300          1   (A,B,C) 分组  
  217. 10 CLERK subtotal:                         1300          1   (A,B) 分组  
  218. 10 MANAGER 1981-06-09 subtotal:            2450          1  
  219. 10 MANAGER subtotal:                       2450          1  
  220. 10 PRESIDENT 1981-11-17 subtotal:          5000          1  
  221. 10 PRESIDENT subtotal:                     5000          1  
  222. 10 subtotal:                               8750          3  (A) 分组 10号部门,共3个成员,工资总计:8750  
  223. 20 CLERK 1980-12-17 subtotal:               800          1  
  224. 20 CLERK subtotal:                          800          1  
  225. 20 ANALYST 1981-12-03 subtotal:            3000          1  
  226. 20 ANALYST subtotal:                       3000          1  
  227. 20 MANAGER 1981-04-02 subtotal:            2975          1  
  228. 20 MANAGER subtotal:                       2975          1  
  229. 20 subtotal:                               6775          3  
  230. 30 CLERK 1981-12-03 subtotal:               950          1  
  231. 30 CLERK subtotal:                          950          1  
  232. 30 MANAGER 1981-05-01 subtotal:            2850          1  
  233. 30 MANAGER subtotal:                       2850          1  
  234. 30 SALESMAN 1981-02-20 subtotal:           1600          1  
  235. 30 SALESMAN 1981-02-22 subtotal:           1250          1  
  236. 30 SALESMAN 1981-09-08 subtotal:           1500          1  
  237. 30 SALESMAN 1981-09-28 subtotal:           1250          1  
  238. 30 SALESMAN subtotal:                      5600          4  
  239. 30 subtotal:                               9400          6  
  240. Total:                                    24925         12  () 全部总计:12 个成员,工资总计为:24925  
  241.   
  242. 已选择25行。  
  243. */  

猜你喜欢

转载自blog.csdn.net/gca995621809/article/details/52622350