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()) 但是我选择了从数据表中选择最后一个月。注意,这里的子查询不是低效的,因为它只运行一次。 结果是:
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';
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
3条答案
按热度按时间kq0g1dla1#
正如我在评论中指出的,连接似乎是最好的解决方案:
我添加了最后一行,只返回过去两个月的差值。我本可以做到的
WHERE a.month_id = MONTH(NOW())
但是我选择了从数据表中选择最后一个月。注意,这里的子查询不是低效的,因为它只运行一次。结果是:
http://sqlfiddle.com/#!2010年11月9日
https://dev.mysql.com/doc/refman/8.0/en/join.html
jdgnovmf2#
你可以试试这个:
sql小提琴:http://sqlfiddle.com/#!9/52a019/2号
您可以在主查询和子查询中添加/更新where条件,以便动态生成月份。如下所示:
2guxujil3#
通过使用join,正如你上个月所说的,我为什么使用
now()
以及month
函数和if month列包含月份号但如果你用的是月名,那么就用
MONTHNAME
在“月份”列中,则查询