SQL 计算月同比、月环比

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');

SQL 计算月同比、月环比_第1张图片

  

月环比的计算逻辑

   在原有的时间加上一月 与原表连接 即可得到本月上月的信息。

月同比的计算逻辑

   在原有的时间加上一年 与原表连接 即可得到本月上年本月的信息。
  

详细步骤

1、查询2019年各月的入职
SQL 计算月同比、月环比_第2张图片
2、在1的基础上加一月
SQL 计算月同比、月环比_第3张图片
3、在1的基础上加一年
SQL 计算月同比、月环比_第4张图片
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.入职日期

SQL 计算月同比、月环比_第5张图片

你可能感兴趣的:(MySql,数据库,sql,mysql)