查找2019年各个月份的入职以及去年同期的入职,结果包括四列: 【年月,入职人数,上月入职人数,去年同期入职人数】
所用数据:
DROP TABLE IF EXISTS `员工入职表`;
CREATE TABLE `员工入职表` (
`入职日期` date,
`入职人数` int(11),
`离职人数` int(11)
) ;
INSERT INTO `员工入职表` VALUES
('2019-01-01', '55', '6'),('2019-02-01', '34', '4'),('2019-04-01', '65', '8'),
('2019-05-01', '29', '2'),('2019-07-01', '33', '3'),('2018-01-01', '42', '11'),
('2018-02-01', '28', '9'),('2018-03-01', '31', '2'),('2018-06-01', '21', '2'),
('2018-07-01', '19', '4'),('2018-08-01', '37', '7'),('2018-10-01', '32', '6'),
('2018-11-01', '22', '1'),('2018-12-01', '26', '1');
在原有的时间加上一月 与原表连接 即可得到本月与上月的信息。
在原有的时间加上一年 与原表连接 即可得到本月与上年本月的信息。
1、查询2019年各月的入职
2、在1的基础上加一月
3、在1的基础上加一年
4、最终sql
select
date_format(a.入职日期, '%Y-%m') as 年月
, a.入职人数
, b.入职人数 as 上月入职人数
, c.入职人数 as 去年同期入职人数
from
(
select
入职日期
, 入职人数
from
员工入职表
where
year (入职日期) = '2019'
) a
left join (
select
入职日期
, 入职人数
, DATE_ADD(入职日期, interval 1 MONTH) as 入职日期加一月
from
员工入职表
where
year (入职日期) = '2019'
or year (入职日期) = '2018'
) b
on a.入职日期 = b.入职日期加一月
left join (
select
入职日期
, 入职人数
, DATE_ADD(入职日期, interval 1 YEAR) as 入职日期加一年
from
员工入职表
where
year (入职日期) = '2018'
) c
on a.入职日期 = c.入职日期加一年
order by a.入职日期
换种写法:
with a as(
select
入职日期
, 入职人数
from
员工入职表
where
year (入职日期) = '2019'
),
b as(
select
入职日期
, 入职人数
, DATE_ADD(入职日期, interval 1 MONTH) as 入职日期加一月
from
员工入职表
where
year (入职日期) = '2019'
or year (入职日期) = '2018'
),
c as(
select
入职日期
, 入职人数
, DATE_ADD(入职日期, interval 1 YEAR) as 入职日期加一年
from
员工入职表
where
year (入职日期) = '2018'
)
select
date_format(a.入职日期, '%Y-%m') as 年月
, a.入职人数
, b.入职人数 as 上月入职人数
, c.入职人数 as 去年同期入职人数
from
a
left join b
on a.入职日期 = b.入职日期加一月
left join c
on a.入职日期 = c.入职日期加一年
order by a.入职日期