sql中grouping運算符rollup,grouping()

mysql不支持grouping運算符,目前僅僅支持rollup。建表:

CREATE TABLE Employee
(
  ID number(10) not null primary key,
  EmpName varchar(20),
  EmpSalary varchar(10),
  EmpDepartment varchar(20)
);

insert all into Employee values(1,'張三','5000','開發部')
into Employee values(2,'李四','2000','銷售部')
into Employee values(3,'王麻子','2500','銷售部')
into Employee values(4,'張三表叔','8000','開發部')
into Employee values(5,'李四表叔','5000','開發部')
into Employee values(6,'王麻子表叔','5000','銷售部')
select 1 from dual

存在這樣一種需求:需要同時顯示每個組的總費用以及所有組的費用合計;如下圖1所示:

圖1

而我們普通的分組查詢是達不到這種要求的,普通分組查詢語句以及結果

SELECT EmpDepartment,SUM(EmpSalary) AS sum_sala FROM employee GROUP BY EmpDepartment
圖2

一種解決方法是:計算所有費用和作爲表A,然後分組並計算每組的費用和作爲表B,最後A union B;這種需要兩個select語句才能完成,那麼有沒有一種簡單有效的方法來實現呢?當然有,那就是grouping運算符rollup

SELECT EmpDepartment,SUM(EmpSalary) AS sum_sala FROM employee GROUP BY rollup(EmpDepartment)    --oracle版本
SELECT EmpDepartment,SUM(EmpSalary) AS sum_sala FROM employee GROUP BY EmpDepartment with rollup  --mysql版本
圖3

圖3中產生第三條記錄即超級分組記錄(sql基礎教程第二版這樣稱呼),由於超級分組紀錄的EmpDepartment鍵值不明確,默認使用null。當然可以使用grouping運算符grouping()來進行判斷,grouping(列字段)的值爲超級分組記錄所產生的null時返回1,其他返回0。通過grouping()case when來解決null,最終如圖4所示。

SELECT CASE WHEN GROUPING(EmpDepartment)=1 THEN '合計' ELSE EmpDepartment END AS EmpDepartment,SUM(EmpSalary) AS sum_sala FROM employee GROUP BY rollup(EmpDepartment)
圖4

本人小白一枚,如有錯誤,還望指出,謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章