【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代码和我一样,是保存在数据库中,通过程序动态读取的,那添加\即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值