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

本人小白一枚,如有错误,还望指出,谢谢!!!

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