计算工资界面
老板为工人发工资,需要统计工资。统计结果如下:
这里的计算是非常复杂的,如:张三给老李、老王、小刘都送过水怎么办?所以要计算张三的送水数量,还要给这个数量加上一个时间的区间,比如说一个月统计一次
在写sql之前要知道:
1.送水工 基本工资 每桶提成 送水数量 实发工资
2.实发工资= (送水数量 * 每桶提成)+基本工资
3.前三列都是worker表的(不用计算) 后面的送水数量和始发工资需要我们计算 数量 实发工资
4.先查 SELECT * FROM tb_worker
得到我们想要的数据,然后依照得到的数据再去查询
用左连接去写 :
实发工资= (送水数量 * 每桶提成)+基本工资 红色的条件已经拿到,目前缺少送水的数量
而送水的数量在 tb_history表里,既然是求数量就要使用聚合函数sum(),可以写成SUM (h.send_water_count) 还可以给它起一个别名send_water_count,写成 AS send_water_count,
再给它们一个分组GROUP BY w . wid就可以了(不加分组出不来)
我们数量拿到之后就应该去求实发工资了
SUM (send_water_count * worker_money)+worker_salary
然后可以给它起一个别名(方便查询后展示用的)
5.此时出现了一个问题,没有送水的话也要给他发基本工资,所以不能是空的。(如果送水数量为null,默认显示0),解决方法:要在sql语句中进行一个判断IFNULL(expr1,expr2)
把SUM (h.send_water_count)丢进去,然后expr2为0(意思就是:如果总数量为空就是0)
6.如果实发工资为null,默认显示基本工资
通用的判断操作:LFNULL(SUM (send_water_count * worker_money)+worker_salary , w.worker_salary)
7.具体展示:
SELECT w.worker_name, w.worker_salary,w.worker_money,
-- 如果送水数量为null,默认显示0
IFNULL(SUM(h.send_water_count),0) AS send_water_count,
-- 如果实发工资为null,默认显示基本工资
IFNULL(SUM(send_water_count * w.worker_money)+w.worker_money,w.worker_salary) AS final_salary
FROM
tb_worker w LEFT JOIN tb_history h ON w.wid = h.worker_id
GROUP BY w.wid
1.1 定义计算工资Salary实体类
这个实体类数据库中并没有这张表,这个实体类是我们专门封装的一个类,就是把各个表中需要的字段封装成一个实体类
package com.minzu.entities;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* TODO: 计算工资相关的实体类
* @author caojie
* @version 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Salary {
/**
* 送水工名称
*/
private String workerName;
/**
* 送水工底薪
*/
private Integer workerSalary;
/**
* 送水工提成
*/
private Double workerMoney;
/**
* 送水数量
*/
private Integer sendWaterCount;
/**
* 实发工资
*/
private Double finalSalary;
}
1.2 定义SalaryMapper接口
package com.minzu.mapper;
import com.baomidou.mybatisplus.core.mapper.Base