亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[Oracle] Group By 語句的擴展 - Rollup、Cube

系統 1977 0

常常寫SQL語句的人應該知道Group by語句的主要使用方法是進行分類匯總,以下是一種它最常見的使用方法(依據部門、職位分別統計業績):

      SELECT  a.dname,b.job,SUM(b.sal) sum_sal
FROM dept a,emp b
WHERE a.deptno = b.deptno
GROUP  BY a.dname,b.job;

DNAME          JOB          SUM_SAL
-------------- --------- ----------
SALES          MANAGER         2850
SALES          CLERK            950
SALES          SALESMAN        5600
ACCOUNTING     MANAGER         2450
ACCOUNTING     PRESIDENT       5000
ACCOUNTING     CLERK           1300
RESEARCH       MANAGER         2975
RESEARCH       ANALYST         6000
RESEARCH       CLERK           1900
    
這時候,假設有人跑過來跟你說:我除了以上數據之外,還要每一個部門總的業績以及全部部門加起來的業績,這時候你非常可能會想到例如以下的笨方法(union all):

      select * from (
SELECT  a.dname,b.job,SUM(b.sal) sum_sal
FROM dept a,emp b
WHERE a.deptno = b.deptno
GROUP  BY a.dname,b.job
UNION ALL
--實現了部門的小計
SELECT  a.dname,NULL, SUM(b.sal) sum_sal
FROM dept a,emp b
WHERE a.deptno = b.deptno
GROUP  BY a.dname
UNION ALL
--實現了全部部門總的合計
SELECT  NULL,NULL, SUM(b.sal) sum_sal
FROM dept a,emp b
WHERE a.deptno = b.deptno)
order by dname;

DNAME          JOB          SUM_SAL
-------------- --------- ----------
ACCOUNTING     CLERK           1300
ACCOUNTING     MANAGER         2450
ACCOUNTING     PRESIDENT       5000
ACCOUNTING                     8750
RESEARCH       CLERK           1900
RESEARCH       MANAGER         2975
RESEARCH       ANALYST         6000
RESEARCH                      10875
SALES          CLERK            950
SALES          MANAGER         2850
SALES          SALESMAN        5600
SALES                          9400
                              29025

union all 合并笨辦法產生的運行計劃
-------------------------------------------------------------------------------
Plan hash value: 2979078843
-------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |      |    29 |   812 |    23  (22)| 00:00:01 |
|   1 |  SORT ORDER BY         |      |    29 |   812 |    23  (22)| 00:00:01 |
|   2 |   VIEW                 |      |    29 |   812 |    22  (19)| 00:00:01 |
|   3 |    UNION-ALL           |      |       |       |            |          |
|   4 |     HASH GROUP BY      |      |    14 |   756 |     8  (25)| 00:00:01 |
|*  5 |      HASH JOIN         |      |    14 |   756 |     7  (15)| 00:00:01 |
|   6 |       TABLE ACCESS FULL| DEPT |     4 |    88 |     3   (0)| 00:00:01 |
|   7 |       TABLE ACCESS FULL| EMP  |    14 |   448 |     3   (0)| 00:00:01 |
|   8 |     HASH GROUP BY      |      |    14 |   672 |     8  (25)| 00:00:01 |
|*  9 |      HASH JOIN         |      |    14 |   672 |     7  (15)| 00:00:01 |
|  10 |       TABLE ACCESS FULL| DEPT |     4 |    88 |     3   (0)| 00:00:01 |
|  11 |       TABLE ACCESS FULL| EMP  |    14 |   364 |     3   (0)| 00:00:01 |
|  12 |     SORT AGGREGATE     |      |     1 |    39 |            |          |
|* 13 |      HASH JOIN         |      |    14 |   546 |     7  (15)| 00:00:01 |
|  14 |       TABLE ACCESS FULL| DEPT |     4 |    52 |     3   (0)| 00:00:01 |
|  15 |       TABLE ACCESS FULL| EMP  |    14 |   364 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------
    
事實上,假設你知道Group By的Rollup擴展的話,這樣的需求僅僅是小case:

      SELECT  a.dname,b.job, SUM(b.sal) sum_sal
FROM dept a,emp b 
WHERE a.deptno = b.deptno
GROUP  BY ROLLUP(a.dname,b.job);

DNAME          JOB          SUM_SAL
-------------- --------- ----------
SALES          CLERK            950
SALES          MANAGER         2850
SALES          SALESMAN        5600
SALES                          9400
RESEARCH       CLERK           1900
RESEARCH       ANALYST         6000
RESEARCH       MANAGER         2975
RESEARCH                      10875
ACCOUNTING     CLERK           1300
ACCOUNTING     MANAGER         2450
ACCOUNTING     PRESIDENT       5000
ACCOUNTING                     8750
                              29025

rollup寫法產生的運行計劃
-----------------------------------------------------------------------------
Plan hash value: 1037965942
-----------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |    14 |   756 |     8  (25)| 00:00:01 |
|   1 |  SORT GROUP BY ROLLUP|      |    14 |   756 |     8  (25)| 00:00:01 |
|*  2 |   HASH JOIN          |      |    14 |   756 |     7  (15)| 00:00:01 |
|   3 |    TABLE ACCESS FULL | DEPT |     4 |    88 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL | EMP  |    14 |   448 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------
    
能夠發現,這樣的方法不但SQL書寫方便,性能也能得到提高。

這時候,假設又有人跑過來說:除了以上數據,他還須要每一個職位總的業績,你僅僅要把rollup換成cube就能夠了,例如以下所看到的:

      -- CUBE分組
SELECT  a.dname,b.job, SUM(b.sal) sum_sal
FROM dept a,emp b 
WHERE a.deptno = b.deptno
GROUP  BY CUBE(a.dname,b.job);

DNAME          JOB          SUM_SAL
-------------- --------- ----------
                              29025
               CLERK           4150
               ANALYST         6000
               MANAGER         8275
               SALESMAN        5600
               PRESIDENT       5000
SALES                          9400
SALES          CLERK            950
SALES          MANAGER         2850
SALES          SALESMAN        5600
RESEARCH                      10875
RESEARCH       CLERK           1900
RESEARCH       ANALYST         6000
RESEARCH       MANAGER         2975
ACCOUNTING                     8750
ACCOUNTING     CLERK           1300
ACCOUNTING     MANAGER         2450
ACCOUNTING     PRESIDENT       5000
    
從上面能夠看出:cube比rollup的展現的粒度更細一些。

這時候,假設又有人跑過來說:他不須要那么細的數據,僅僅須要匯總的數據,能夠使用Grouping Sets:

      ---GROUPING SETS分組
SELECT to_char(b.hiredate,'yyyy') hire_year,a.dname,b.job, SUM(sal) sum_sal
FROM dept a,emp b 
WHERE a.deptno = b.deptno
GROUP BY GROUPING SETS(to_char(b.hiredate,'yyyy'),a.dname,b.job);

HIRE DNAME          JOB          SUM_SAL
---- -------------- --------- ----------
1987                                4100
1980                                 800
1982                                1300
1981                               22825
     ACCOUNTING                     8750
     RESEARCH                      10875
     SALES                          9400
                    CLERK           4150
                    SALESMAN        5600
                    PRESIDENT       5000
                    MANAGER         8275
                    ANALYST         6000
    


[Oracle] Group By 語句的擴展 - Rollup、Cube和Grouping Sets


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 在线观看亚洲 | 99热这里只有精品9 99热这里只有精品99 | 欧美亚洲国产一级毛片 | 成人精品网| 理论一级片 | 久久午夜网 | 噜噜噜天天躁狠狠躁夜夜精品 | 久久爱99| 深夜福利国产精品亚洲尤物 | a级成人毛片久久 | 一级特级欧美aa毛片免费 | 欧美乱人免费视频观看 | 老子影院午夜伦手机在线看 | 超级97碰碰碰碰久久久久最新 | 色综合久久久久综合体桃花网 | 国产免费久久精品 | 日韩中文字幕精品久久 | 欧美18在线 | 免费特黄一级欧美大片 | 成人免费毛片观看 | 永久看日本大片免费 | 天天插夜夜爽 | 成年人性生活免费视频 | 免费在线观看黄色的网站 | 免费看欧美一级a毛片 | 97久久久久国产精品嫩草影院 | 日本不卡在线一区二区三区视频 | 999国内精品永久免费视频 | 欧美日韩中文一区二区三区 | 天堂成人一区二区三区 | 国产免费爱在线观看视频 | 性生生活网站免费 | 99爱视频在线观看免费播放 | 婷婷综合社区 | 国产欧美日韩精品第三区 | 欧美国产成人精品一区二区三区 | 亚洲综合日韩精品欧美综合区 | 综合啪啪| 九九视频只有精品六 | 99在线观看精品视频 | 黄片毛片大全 |