mysql使用rownum方式,实现部门排名和公司排名
Posted 小魏的马仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql使用rownum方式,实现部门排名和公司排名相关的知识,希望对你有一定的参考价值。
环境
spring + hibernate + mysql
需求
个人回款按照月份进行部门内排名以及全公司排名
逻辑
- 通过行编号的方式,获取全公司排名
- 传入参数部门名称,通过case when方式,只有在该部门员工时,才进行部门排名
遗留问题
- 只能获取到单独一个部门的排名以及该部门员工的公司排名
代码
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方式,实现部门排名和公司排名的主要内容,如果未能解决你的问题,请参考以下文章