日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

發(fā)布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址:http://blog.csdn.net/u014558001/article/details/42387929

本文主要講解 ROLLUP, CUBE, GROUPING SETS的主要用法,這些函數(shù)可以理解為GroupBy分組函數(shù)封裝后的精簡用法,相當于多個union all 的組合顯示效果,但是要比 多個union all的效率要高。

其實這些函數(shù)在時間的程序開發(fā)中應用的并不多,至少在我工作的多年時間中沒用過幾次,因為現(xiàn)在的各種開發(fā)工具/平臺都自帶了這些高級分組統(tǒng)計功能,使用的方便性及美觀性都比這些要好。但如果臨時查下數(shù)據(jù),用這些函數(shù)還是不錯的。

創(chuàng)建測試環(huán)境

1.????? 創(chuàng)建表

?

[sql] view plain copy
  • createtable?EMP2??
  • (??
  • ??ID???????NUMBER,??--?員工編號??
  • ??NAME?????VARCHAR2(20),?--姓名??
  • ??SEX?????VARCHAR2(2),??--性別??
  • ??HIREDATE?DATE,?????????--入職日期??
  • ??BASE????VARCHAR2(20),?--工作母地??
  • ??DEPT????VARCHAR2(20),?--所在部門??
  • ??SAL?????NUMBER????????--月工資??
  • );??

  • ?

    2.????? 插入測試數(shù)據(jù)

    ?

    [sql] view plain copy
  • insert?into?emp2?(ID,?NAME,?SEX,?HIREDATE,BASE,?DEPT,?SAL)??
  • values?(107,?'小月',?'女',?to_date('01-09-2013',?'dd-mm-yyyy'),?'北京','營運',?9000);??
  • insert?into?emp2?(ID,?NAME,?SEX,?HIREDATE,BASE,?DEPT,?SAL)??
  • values?(108,?'小美',?'女',?to_date('01-06-2011',?'dd-mm-yyyy'),?'上海','營運',?11000);??
  • insert?into?emp2?(ID,?NAME,?SEX,?HIREDATE,BASE,?DEPT,?SAL)??
  • values?(101,?'張三',?'男',?to_date('01-01-2011',?'dd-mm-yyyy'),?'北京','財務',?8000);??
  • insert?into?emp2?(ID,?NAME,?SEX,?HIREDATE,BASE,?DEPT,?SAL)??
  • values?(102,?'李四',?'男',?to_date('01-01-2012',?'dd-mm-yyyy'),?'北京','營運',?15000);??
  • insert?into?emp2?(ID,?NAME,?SEX,?HIREDATE,BASE,?DEPT,?SAL)??
  • values?(103,?'王五',?'男',?to_date('01-01-2013',?'dd-mm-yyyy'),?'上海','營運',?6000);??
  • insert?into?emp2?(ID,?NAME,?SEX,?HIREDATE,BASE,?DEPT,?SAL)??
  • values?(104,?'趙六',?'男',?to_date('01-01-2014',?'dd-mm-yyyy'),?'上海','財務',?10000);??
  • insert?into?emp2?(ID,?NAME,?SEX,?HIREDATE,BASE,?DEPT,?SAL)??
  • values?(105,?'小花',?'女',?to_date('01-08-2014',?'dd-mm-yyyy'),?'上海','財務',?4000);??
  • insert?into?emp2?(ID,?NAME,?SEX,?HIREDATE,BASE,?DEPT,?SAL)??
  • values?(106,?'小靜',?'女',?to_date('01-01-2015',?'dd-mm-yyyy'),?'北京','財務',?6000);??
  • commit;??

  • ?

    ?

    3.???? 查看一下剛才插入的數(shù)據(jù)

    ?

    [sql] view plain copy
  • select?*?from?emp2;??

  • ?

    ?

    ?

    4.????? 先看下普通分組的效果

    按照地區(qū)統(tǒng)計每個部門的總工資

    [sql] view plain copy
  • select?base,dept?,sum(sal)?from?emp2???
  • group?by?base,dept;??

  • 查看結(jié)果如下:

    ?

    ?

    ROLLUP(累計累加)

    ROLLUP是對group by的擴展,因此,它只能出現(xiàn)在group by子句中,依賴于分組的列,對每個分組會生成匯總數(shù)據(jù), rollup和group by聯(lián)合一起使用,達到了按group by列順序分組,并且實現(xiàn)小計和合計的功能。rollup分組還是有序的,先全部分組,然后對每個分組小計,最后合計。

    rollup中列的順序不同,則統(tǒng)計的結(jié)果不同。因為它是按列從右遞減分組的。

    比如 Group by? ROLLUP(A, B, C),首先會對(A、B、C)進行GROUP BY,然后對(A、B)進行GROUP BY,然后是(A)進行GROUP BY,最后對全表進行GROUP BY操作

    ?

    按照地區(qū)統(tǒng)計每個部門的總工資,按工作母地匯總,再合計

    ?

    [sql] view plain copy
  • select?base,dept,sum(sal)?from?emp2???
  • groupbyrollup(base,dept);??

  • ?

    ?

    ?

    結(jié)果相當于

    ?

    [sql] view plain copy
  • select?base,dept,sum(sal)?from?emp2???
  • group?by?base,dept??
  • unionall??
  • select?base,null,sum(sal)?from?emp2???
  • group?by?base,null??
  • unionall??
  • selectnull,null,sum(sal)?from?emp2???
  • group?by?null,null??
  • order?by?1,2??

  • ?

    ?

    ?

    如果顛倒下rollup順序則結(jié)果如下:

    [sql] view plain copy
  • select?base,dept,sum(sal)?from?emp2???
  • group?by?rollup(dept,base);??

  • ?

    ?

    如果在實際查詢中,有的小計或合計我們不需要,那么就要使用局部rollup,局部rollup就是將需要固定統(tǒng)計的列放在group by中,而不是放在rollup中。

    ?

    ?

    [sql] view plain copy
  • select?base,dept,sum(sal)?from?emp2???
  • group?by?dept,rollup(base);??


  • ?

    與group by rollup(dept,base)相比:去掉了最后一行的匯總,因為每次匯總要么是dept,base,要么是dept,null ,dept是固定的。

    ?

    ?

    如果只希望看到合計則可以這樣寫:

    ?

    [sql] view plain copy
  • select?base,dept?,sum(sal)?from?emp2???
  • group?by?rollup((base,dept));??

  • ?

    ?

    ?

    ?

    ?

    CUBE(交叉列表)

    CUBE也是對group by運算的一種擴展,它比rollup擴展更加精細,組合類型更多,rollup是按組合的列從右到左遞減分組計算,而CUBE則是對所有可能的組合情況進行分組,這樣分組的情況更多,覆蓋所有的可能分組,并計算所有可能的分組的小計。

    ?

    對于CUBE來說,列的名字只要一樣,那么順序無所謂,結(jié)果都是一樣的,因為cube是各種可能情況的組合,只不過統(tǒng)計的結(jié)果順序不同而已。但是對于rollup來說,列的順序不同,則結(jié)果不同。

    ?

    ?

    比如對工作母地和部門的交叉統(tǒng)計

    [sql] view plain copy
  • select?base,dept,sum(sal)?from?emp2???
  • group?by?cube(base,dept)??
  • order?by?1,2;??

  • ?

    ?

    ?

    部分CUBE和部分ROLLUP類似,把需要固定統(tǒng)計的列放到group by中,不放到cube中就可以了。

    如果cube中只有一個列,那么和rollup的結(jié)果一致

    ?

    ?

    [sql] view plain copy
  • select?base,dept,sum(sal)?from?emp2???
  • group?by?dept,cube(base)??
  • order?by1,2;??

  • ?

    ?

    ?

    rollup和cube區(qū)別:

    如果是ROLLUP(A,B, C)的話,GROUP BY順序

    (A、B、C)

    (A、B)

    (A)

    最后對全表進行GROUPBY操作。

    如果是GROUP BY CUBE(A, B, C),GROUP BY順序
    (A、B、C)

    (A、B)

    (A、C)

    (A),

    (B、C)

    (B)

    (C),

    最后對全表進行GROUPBY操作。

    ?

    GROUPING SETS

    對group by的另一個擴展,專門對分組列分別進行小計計算,不包括合計。使用方式和rollup和cube一樣,都是放在group by中。

    ??

    比如需要分別統(tǒng)計工作母地與部門的合計:

    ?

    [sql] view plain copy
  • select?base,dept,sum(sal)?from?emp2???
  • group?by?grouping?sets(base,dept);??

  • 結(jié)果為:

    ?

    等價于

    ?

    [sql] view plain copy
  • select?base,null,sum(sal)?from?emp2???
  • group?by??base,null??
  • unionall??
  • select?null,dept,sum(sal)?from?emp2???
  • group?by??null,dept;??

  • ?

    ?

    理解了groupingsets的原理我們用他實現(xiàn)rollup的功能也是可以的:

    ?

    [sql] view plain copy
  • select?base,dept,sum(sal)?from?emp2???
  • group?by?grouping?sets?((base,dept),dept,null);??

  • ?

    效果如下:

    ?

    ?

    ?

    ?

    grouping函數(shù)

    在以上例子中,是用rollup和cube函數(shù)都會對結(jié)果集產(chǎn)生null,這時候可用grouping函數(shù)來確認該記錄是由哪個字段得出來的

    grouping函數(shù)用法,帶一個參數(shù),參數(shù)為字段名,結(jié)果是根據(jù)該字段得出來的就返回1,反之返回0

    例如:

    ?

    [sql] view plain copy
  • select?decode(grouping(base),1,'所有地區(qū)',base)?base,??
  • decode(grouping(dept),1,'所有部門',dept)dept?,sum(sal)?from?emp2???
  • group?by?rollup(dept,base);??

  • ?

    ?

    ?

    ?

    更多ROLLUP,CUBE, GROUPING SETS與GROUP BY的關(guān)系可以參考Oracle官方文檔中的例子

    ?

    http://docs.oracle.com/cd/E11882_01/server.112/e25554/aggreg.htm#DWHSG8608

    總結(jié)

    以上是生活随笔為你收集整理的[转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 九九小视频| 欧美五月婷婷 | 鲁一鲁一鲁一鲁一av | 岛国大片在线免费观看 | 亚洲在线影院 | 91麻豆蜜桃一区二区三区 | jiz亚洲 | 精品人妻一区二区三区蜜桃视频 | 日本理论片在线 | 中文综合网| 最新不卡av | 涩涩涩999 | 欧美成人福利视频 | 免费三片在线观看网站v888 | 国产精品九一 | 亚洲88 | 精品国产精品三级精品av网址 | 国产成人精品一区二三区 | av黄色av | 亚洲系列在线观看 | av在线一 | 国产美女流白浆 | 99在线免费观看视频 | 国产精品无遮挡 | 外国av在线 | 久久嫩草精品久久久久 | 99er精品视频 | 日本色视 | 亚洲免费大片 | 女人被狂躁c到高潮 | 欧美xxxxx自由摘花 | 亚洲欧洲日本精品 | 老鸭窝成人 | 大战熟女丰满人妻av | 成年视频在线 | 在线观看av一区二区 | 一区二区三区欧美精品 | 在线看片中文字幕 | 国产午夜精品一区二区理论影院 | 91成人福利 | 少妇又紧又色又爽又刺激视频 | 91av免费观看 | 天天躁日日躁狠狠躁 | 一本色道久久亚洲综合精品蜜桃 | 亚洲激情欧美色图 | 亚洲综合视频在线观看 | 亚洲欧美另类图片 | 色哟哟免费 | 极品久久| 中文字幕有码在线视频 | 日韩在线观看免费全 | 国产又粗又猛又爽又黄 | 91精彩视频 | 激情戏网站| 亚洲30p | 亚洲av无码国产精品久久不卡 | 91福利在线观看 | 亚洲女则毛耸耸bbw 边吃奶边添下面好爽 | 中文字幕日韩人妻在线视频 | 欧美一区二区三区 | 91成年人视频 | 国产精品一区二区麻豆 | 无套内谢老熟女 | 色偷偷综合| 亚洲黄片一区二区 | 欧美电影一区二区三区 | 8050午夜二级 | www.av小说| www天堂在线 | 超碰爱爱| 在线免费观看黄色网址 | 一区二区在线播放视频 | 三级不卡 | 亚洲男人第一网站 | 国产精品一区二区人妻喷水 | 欧美人与性动交xxⅹxx | 香蕉精品视频在线观看 | 天天草天天射 | 精品国产福利 | 日韩精品自拍偷拍 | 网站在线播放 | 大肉大捧一进一出好爽视频 | 久久精品一区二区三区黑人印度 | 边啃奶头边躁狠狠躁 | 色999在线| 欧美色第一页 | 成人在线免费小视频 | 国产富婆一区二区三区 | 69影院在线观看 | 成人av一级 | 精彩毛片 | 久久久久久久亚洲 | 久久国产日韩欧美 | 日本一区二区三区精品 | 免费a视频在线观看 | 成人做受视频试看60秒 | 亚洲a v网站 | 成人精品综合 | 国产精品久久久久无码av色戒 |