栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/673065.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号