SQL 计算月同比、月环比

情景

查找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.入职日期

在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值