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



