员工最近两个月的工资差异

g6ll5ycj  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(391)

我要把所有员工过去两个月的工资差额取出来。
样本数据:http://sqlfiddle.com/#!9/02bfb/1号
预期产量:

我尝试的查询:

SELECT tab1.name, tab1.emp_id 
FROM a_test tab1 join a_test tab2
on tab1.id = tab2.id
group by tab1.emp_id
kq0g1dla

kq0g1dla1#

正如我在评论中指出的,连接似乎是最好的解决方案:

SELECT a.emp_id,
       a.salary-b.salary AS diff, 
       CONCAT(a.salary,' - ',b.salary) as diff_str
FROM a_test AS a
JOIN a_test AS b 
ON a.emp_id = b.emp_id AND a.month_id-1 = b.month_id
WHERE a.month_id = (SELECT MAX(month_id) FROM a_test)

我添加了最后一行,只返回过去两个月的差值。我本可以做到的 WHERE a.month_id = MONTH(NOW()) 但是我选择了从数据表中选择最后一个月。注意,这里的子查询不是低效的,因为它只运行一次。
结果是:

emp_id    diff    diff_str
1       -26000    27000 - 53000
2         9000    32000 - 23000

http://sqlfiddle.com/#!2010年11月9日
https://dev.mysql.com/doc/refman/8.0/en/join.html

jdgnovmf

jdgnovmf2#

你可以试试这个:

select (parent.salary - (select ch.salary from a_test as ch where ch.emp_id = parent.emp_id order by id desc limit 1,1)) as diff, emp_id, name, salary, month from a_test as parent where month = 'feb';

sql小提琴:http://sqlfiddle.com/#!9/52a019/2号
您可以在主查询和子查询中添加/更新where条件,以便动态生成月份。如下所示:

where month = MONTHNAME(CURRENT_DATE())
2guxujil

2guxujil3#

通过使用join,正如你上个月所说的,我为什么使用 now() 以及 month 函数和if month列包含月份号

select t1.emp_id,t1.name,(t1.salary-t2.salary) as sal_diff from
    (
    select * 
    from a_test
    where month=Month(now())
    ) as t1
    left join 
    (
    select * from a_test
    where month=month(now())-1
      ) as t2
      on t1.emp_id=t2.emp_id

但如果你用的是月名,那么就用 MONTHNAME 在“月份”列中,则查询

select t1.emp_id,t1.name,(t1.salary-t2.salary) as sal_diff from
        (
        select * 
        from a_test
        where month=MONTHNAME(STR_TO_DATE(month(now()), '%m'))
        ) as t1
        left join 
        (
        select * from a_test
        where month=MONTHNAME(STR_TO_DATE(month(now())-1, '%m'))
          ) as t2
          on t1.emp_id=t2.emp_id

相关问题