mysql使用rownum方式,实现部门排名和公司排名

Posted 小魏的马仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql使用rownum方式,实现部门排名和公司排名相关的知识,希望对你有一定的参考价值。

环境

spring + hibernate + mysql

需求

个人回款按照月份进行部门内排名以及全公司排名

逻辑

  1. 通过行编号的方式,获取全公司排名
  2. 传入参数部门名称,通过case when方式,只有在该部门员工时,才进行部门排名

遗留问题

  1. 只能获取到单独一个部门的排名以及该部门员工的公司排名

代码

SELECT
	g.ENGINEER_,
	g.ORG_NAME_,
	g.MONEY_,
	g.COM_NUM_,
	g.ORG_NUM_
FROM
	(
		SELECT
			e.ENGINEER_,
			e.NAME_,
			e.MONEY_,
			e.COM_NUM_,
			CASE
		WHEN e.ORG_NAME_ = '部门名称' THEN
			@orgrowno :=@orgrowno + 1
		ELSE
			- 1
		END AS ORG_NUM_
		FROM
			(
				SELECT
					b.ENGINEER_,
					b.ORG_NAME_,
					b.MONEY_,
					@rowno :=@rowno + 1 AS COM_NUM_
				FROM
					(
						SELECT
							a.ENGINEER_,
							SUM(a.DISTRIBUTION_MONEY_) AS MONEY_,
							a.YEAR_,
							a.MONTH_,
							a.ORG_NAME_
						FROM
							t_import_remittance_detail a
						WHERE
							a.YEAR_ = 2021
						AND a.MONTH_ = '12'
						GROUP BY
							a.ENGINEER_,
							a.YEAR_,
							a.MONTH_
						ORDER BY
							SUM(a.DISTRIBUTION_MONEY_) DESC
					) b,
				(SELECT @rowno := 0) t
			) e,
			(SELECT @orgrowno := 0) f
	) g
WHERE
	g.ENGINEER_ = '员工名称'

问题

在通过hql执行原生代码时,遇到了Space is not allowed after parameter prefix ':' 问题,原因是 @orgrowno := 0中的:冒号,需要进行转义。

按照网上的说法, @orgrowno := 0 改为 @orgrowno\\\\ := 0

但是由于我们的原生sql是存储在数据库中,通过key读取方式获取的原生sql代码,因此\\并没有生效,折腾了一下午才搞定。原因是如果用StringBuffer的方式拼接原生sql代码,那就添加\\\\,如果你的原生sql代码和我一样,是保存在数据库中,通过程序动态读取的,那添加\\即可

以上是关于mysql使用rownum方式,实现部门排名和公司排名的主要内容,如果未能解决你的问题,请参考以下文章

mysql使用rownum方式,实现部门排名和公司排名

mysql使用rownum方式,实现部门排名和公司排名

Mysql 增加rownum

sql查询员工的基本工资排名第3-6位的姓名和基本工资

mysql实现rownum方法

mysql分组排序后取出几条记录,