2009年11月13日 星期五

[Oracle]Group By Rollup Function介紹

有時候User開的需求有列出所有資料後,資料集的最後為所有數值的總計,或是特定群組的小計。

如何在Oracle做到小計與總計的功能呢???答案就是Rollup !!!

Rollup的翻譯:捲起 奇摩字典

在SQL的世界中,就是可以針對Group By的欄位做小計的功能。


員工資料中有 員工名稱、工號、部門、職務代號、薪水,
如果我們想要得到兩個結果:

1.每個部門不同職務的員工薪水的加總 
2.每個部門的員工薪水的加總

其實第二個結果就是第一個結果的小計。
我們可以分兩種查詢方式, 一是下兩次SQL得到兩個結果集,當然使用Rollup就可以一次得到我們要的結果集了。

先介紹會用到的兩張Table:employees , departments

employees 













departments














解法一:

1.每個部門不同職務的員工薪水的加總
select d.department_name, e.job_id, sum(e.salary) group_salary
  from employees e, departments d
 where e.department_id = d.department_id
 group by d.department_name, e.job_id
;
















2.每個部門的員工薪水的加總
select d.department_name, sum(e.salary) group_salary
  from employees e, departments d
 where e.department_id = d.department_id
 group by d.department_name
;










解法二:

針對職務名稱(Job_ID)做小計,就是在group by 中加入rollup(job_id)
其中另外加入grouping,grouping(job_id)的結果為1,即為小計的結果。
select d.department_name,
       e.job_id,
       grouping(e.job_id) job_flag,
       sum(e.salary) group_salary
  from employees e, departments d
 where e.department_id = d.department_id
 group by d.department_name, rollup(e.job_id)
;

2 則留言:

  1. 建議解法一的第一個結果能夠order by Department Name一下,這樣比較好跟解法二做比較喔 ^^

    回覆刪除
  2. 寫了一篇使用報表工具跟你這篇呼應的文章喔
    http://pinnynet.blogspot.com/2009/11/cliend-side-report-rdlc-group.html

    回覆刪除