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所示:
而我们普通的分组查询是达不到这种要求的,普通分组查询语句以及结果
SELECT EmpDepartment,SUM(EmpSalary) AS sum_sala FROM employee GROUP BY EmpDepartment
一种解决方法是:计算所有费用和作为表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中产生第三条记录即超级分组记录(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)
本人小白一枚,如有错误,还望指出,谢谢!!!