两次分组计算员工工资的SQL(MyBatis框架)

需求介绍

字段注释
id自增ID
hrID区分管理员
name姓名
nameID职员代码
userinfoID无关紧要
time值班时间
templateID当前需求无关紧要的字段
shifts班次
hierarchy津贴
coefficient系数
isEnable当前需求无关紧要的字段
remarkSUM汇总备注
remark普通备注
updater修改者
updaterTime修改时间
updaterIP修改者IP

要求按照班次(shifts)和职员代码(nameID)分组求系数乘以津贴(coefficient *hierarchy)的积,然后再按照nameID分组求系数乘以津贴(coefficient *hierarchy)的积的和;

解释:把班次相同并且职员代码相同的人的系数乘上津贴的积,然后在上一步的基础上把职员代码相同的计算后的值再次分组

Mapper.xml

<select id="listTimeWorkSUM" resultMap="BaseResultMap" parameterType="java.util.List"> 
	    SELECT NAME,nameID,remarkSUM,updater, updaterTime,updaterIP,SUM(hierarchy) hierarchy FROM 
		(SELECT NAME,nameID,shifts,remarkSUM,updater, updaterTime,updaterIP,
		SUM(coefficient) coefficient,SUM(coefficient)*hierarchy hierarchy
		FROM WORK WHERE nameID IN
		<foreach collection="list" item="item" open="(" separator="," close=")">
		    #{item.nameID}
	    </foreach>
		AND YEAR(TIME)=#{year} AND MONTH(TIME)=#{month} AND hrID=#{hrID}
		GROUP BY nameID,shifts ORDER BY nameID) nieqiang GROUP BY nameID
</select>

<!-- 去重查询nameID -->
<select id="listTimeWorkNameID" resultMap="BaseResultMap">
		SELECT DISTINCT(nameID), name FROM WORK
</select>

Mapper.java

List<Work> listTimeWorkSUM(Integer hrID, int year, int month, @Param("list")List<Work> list);
List<Work> listTimeWorkNameID();

Service.java

/**
*	UserIPUtil.getCurrentHrId()工具类
*	public class UserIPUtil {
*		public static Integer getCurrentHrId() {
*			return ((Hr)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId();
*		}
*	}
**/
public List<Work> listTimeWorkSUM(Integer hrID, Integer year, Integer month) {
		if(listTimeWorkNameID().size() == 0) {
			return null;
		}
		if (UserIPUtil.getCurrentHrId() == 1) {
			List<Work> work = workMapper.listTimeWorkSUM(hrID, year, month, listTimeWorkNameID());
			//Map<String, Double> map = work.stream().collect(Collectors.groupingBy(Work::getNameID,Collectors.summingDouble(Work::getHierarchy)));
			return work;
		}
	    List<Work> work = workMapper.listTimeWorkSUM(UserIPUtil.getCurrentHrId(), year, month, listTimeWorkNameID());
		return work;
	}
	
public List<Work> listTimeWorkNameID(){
	return workMapper.listTimeWorkNameID();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值