oracle–rollup 和cube分組累計求和

group by 語句支持基本的having條件,還支持rollup和cube提供信息匯總功能,類似小計。 rollup:縱向小計,從右向左逐個對每一列進行小結并在結果中生成獨立的一行。只返回第一個分組條件指定的列的統計行。 cube:橫行小計 selectd.deptno,t.job,sum(t.sal)

group by 語句支持基本的having條件,還支持rollup和cube提供信息匯總功能,類似小計。

rollup:縱向小計,從右向左逐個對每一列進行小結并在結果中生成獨立的一行。只返回第一個分組條件指定的列的統計行。

cube:橫行小計

  1. select?d.deptno,t.job,sum(t.sal)?from?emp?t,dept?d ??
  2. where?t.deptno=d.deptno ??
  3. group?by?rollup(d.deptno,t.job)??

執行結果:

oracle–rollup 和cube分組累計求和

***

使用grouping_id顯示指定的分組級別的記錄。返回grouping()位向量的十進制值,GROUPING位向量的計算方法是將按照順序對每一列調用GROUPING函數的結果組合起來。

例:grouping_id(a,b,c),a為空就是0非空為1,b和c也一樣,結果會得到一個三位數,用二進制轉換成十進制就是了,a,b,c全是非空,即111就是7,三列就是7,如果是兩列自然是11就是3

select … from 表 group by rollup(…..) having grouping_id(….)

?

rollup(x,y)2列 rollup(x,y,z)3列
總計是grouping_id=3 總計是grouping_id=7
小計grouping_id=1 小計grouping_id=3
記錄是grouping_id=0 記錄是grouping_id=0

?

此時要求不顯示最后總計行:

  1. select?d.deptno,t.job,sum(t.sal)?from?emp?t,dept?d ??
  2. where?t.deptno=d.deptno ??
  3. group?by?rollup(d.deptno,t.job)having?grouping_id(d.deptno,t.job)

執行結果:

oracle–rollup 和cube分組累計求和

實際情況中要展示結果集中匯總列加上小計和合計,此時這樣處理:

執行結果:

oracle–rollup 和cube分組累計求和

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享