MySQL对数据表进行数据汇总并得出排名

问题描述:

现有表格t1,t1中有checkdoctor(检查人员)字段,无count(汇总统计)和rank(排名字段),现要求在指定条件下获取各个检查人员的工作量排名,允许并列排名。由于使用MySQL数据库,没有rank函数可使用,该如何实现呢?

解决思路:

在mysql中,可借助rowNum实现查询排名的功能,

说明:在MSQL中可使用@rownum声明变量,使用:=赋值,详见下面的描述

@rownum := @rownum + 1 中 := 是赋值的作用,这句话的意思是先执行@rownum + 1,然后把值赋给@rownum;

(SELECT @rownum := 0) r 这句话的意思是设置rownum字段的初始值为0,即编号从1开始

实现代码:

SELECT @rownum:=@rownum+1 AS rownum,IF(@total = cnt ,@rank ,@rank :=@rownum) AS rank ,
@total := cnt as total, der.* FROM
(
select SSUPPLIERCODE,checkdoctor,count(*) as cnt from t1 WHERE SSUPPLIERCODE='01'
group by checkdoctor ORDER BY cnt desc
) as der,(SELECT  @rank := 0 ,@rownum := 0 ,@total := NULL) as t;

mysql中的查询结果:

MySQL对数据表进行数据汇总并得出排名_第1张图片

如果想查询指定checkdoctor的排名,对以上SQL作下修改即可,即以上面的查询结果作为临时表,在外围添加一个查询,以checkdoctor作为查询条件,参考如下 :

SELECT rank from (SELECT @rownum:=@rownum+1 AS rownum,IF(@total = cnt ,@rank ,@rank :=@rownum) AS rank ,
@total := cnt as total, der.* FROM
(
select SSUPPLIERCODE,checkdoctor,count(*) as cnt from t1 WHERE SSUPPLIERCODE='01'
group by checkdoctor ORDER BY cnt desc
) as der,(SELECT  @rank := 0 ,@rownum := 0 ,@total := NULL) as t) AS a WHERE a.checkdoctor='李四';

查询结果如下:

在实现过程中,受到博友的启发https://www.cnblogs.com/bindot/p/tongji.html,在此表示感谢!

你可能感兴趣的:(mysql)