GROUP分組函式之ROLLUP

2021-09-30 15:31:56 字數 1720 閱讀 4866

/******************

*rollup函式的使用

******************/

案例1需求:

× 統計每個部門每個職位的薪水和

× 統計每個部門所有職位的薪水小計

× 統計所有部門所有職位的薪水合計

× 需要顯示部門名、職位名和累加後的薪水

--需求1

select d.dname, e.job, sum(e.sal) sum_sal

from dept d, emp e

where d.deptno = e.deptno

group by d.dname, e.job

union all

--需求2

select d.dname, null, sum(e.sal) sum_sal

from dept d, emp e

where d.deptno = e.deptno

group by d.dname

union all

--需求3

select null, null, sum(e.sal) sum_sal

from dept d, emp e

where d.deptno = e.deptno;

--使用rollup分組

select d.dname, e.job, sum(e.sal) as sum_sal

from dept d, emp e

where d.deptno = e.deptno

group by rollup(d.dname, e.job);

rollup(d.dname, e.job)的分組過程是:

1)標準分組:group by (d.dname, e.job),對每個部門每個職位進行分組

2)從右到左遞減:group by (d.dname, null),其實這個null沒有必要使用,這裡只是為了

方便分析。這個過程是對上乙個級別分組的小計,也就是對每個dname值,計算橫跨所有

job的小計。

3)最後合計:相當於 group by (null,null).

上面的rollup只用了兩個列,如果有n個列,那麼結果就是n+1中group by的組合,

另外,在rollup操作是,如果使用hint:expand_gset_to_union,則優化器會將rollup轉為

對應的union all操作。

案例2

需求 × 計算每個入職時間(年)、部門、職位的標準分組的薪水和;

× 計算每個入職時間(年)、部門的所有職位的薪水小計;

× 計算每個入職時間(年)的所有部門所有職位的薪水小計。

× 最後合計薪水,顯示入職時間(年)、部門名、職位名

select to_char(e.hiredate, ' yyyy') hire_year,

d.dname,

e.job,

sum(sal) sum_sal

from dept d, emp e

where d.deptno = e.deptno

group by rollup(to_char(e.hiredate, ' yyyy'), d.dname, e.job)

solr分組查詢GROUP

order處理 if order params sort order group處理 if group else 執行查詢 response this search where,limit start,limit end,params 引數 型別說明 group 布林值設為true,表示結果需要分組...

記錄下mysql的分組聚合函式group by

今天維護客戶的儲存過程時發現乙個問題,連鎖客戶只有銷售明細表,沒訂單表,而公司要求寫查詢訂單的儲存過程,客戶那邊使用的資料是sqlserver,我使用了分組聚合函式group by 例如 這樣子寫sqlserver會報錯,因為group by 要求查詢的字段也得包含在聚合函式裡。select ord...

關於MongoDB的group分組

關於mongodb的group分組 測試條件 windows mongodb 1.8.2 先插入測試資料 for var i 1 i 20 i 1.普通 分組查詢 db.test.group initial reduce function doc,prev db.runcommand initial...