关于SQL求同比、环比

同比和环比的意思

  • 同比

一般情况下是今年第n月与去年第n月比。同比发展速度主要是为了消除季节变动的影响,用以说明本期发展水平与去年同期发展水平对比而达到的相对发展速度。如,本期2月比去年2月,本期6月比去年6月等。

  • 环比

表示连续2个单位周期(比如连续两月)内的量的变化比。环比包括两种:环比增长速度和环比发展速度。

同比和环比的计算公式

  • 同比发展速度

同比发展速度 = 本期发展水平 / 去年同期水平 × 100%

  • 同比增长速度

同比增长速度 =(本期发展水平-去年同期水平)/ 去年同期水平 × 100%

在实际工作中,经常使用这个指标,如某年、某季、某月与上年同期对比计算的发展速度,就是同比发展速度。

  • 环比增长率

(本期数-上期数)/上期数×100%

反映本期比上期增长了多少

环比发展速度,一般是指报告期水平与前一时期水平之比,表明现象逐期的发展速度

  • 同比增长率

同比增长率 =(本期数-同期数)/ |同期数| × 100%。

同比和环比的区别

  • 同比是本期与同期做对比,环比是本期与上期做对比。
  • 环比一般是用在月、日很少用在年上,主要是对比很短时间内涨幅程度,不过由于行业差异,比如旅游,会受到淡旺季影响。
  • 同比一般用在相邻两年,相同时间段内,查看涨幅程度,一般用在两年相同月份,很少用在两月相同日期。

表结构

在这里插入图片描述

1.得到同比数据

在这里插入图片描述

扫描二维码关注公众号,回复: 11868137 查看本文章

2.选择月份 获取环比数据

在这里插入图片描述

建表

CREATE TABLE `SalesDetail` (
`ID` int,
`DepartName` VARCHAR(50),
`Sales` DECIMAL (10, 2),
`SalesDate` datetime 
);

insert into SalesDetail(ID, DepartName, Sales, SalesDate)

select 1, '营销一部', 300, '2006-7-1'
UNION ALL select 2, '营销二部', 500, '2006-7-1'
UNION ALL select 3, '营销三部', 800, '2006-8-1'
UNION ALL select 4, '营销一部', 600, '2006-8-1'
UNION ALL select 5, '营销二部', 800, '2006-8-1'
UNION ALL select 6, '营销一部', 400, '2007-7-1'
UNION ALL select 7, '营销二部', 800, '2007-7-1'
UNION ALL select 8, '营销三部', 700, '2007-8-1'
UNION ALL select 9, '营销一部', 600, '2008-7-1'
UNION ALL select 10, '营销二部', 700, '2008-7-1'

答案

-- 得到环比

select c.DepartName as 部门, convert(varchar(10), c.SalesDate, 23) as 对比年月, 
 c.Sales as 本月销售总量, d.Sales as 上月销售总量, 
 case when d.Sales is null or d.Sales=0 then '无穷大' else cast(cast((isnull(c.Sales, 0)-isnull(d.Sales,0))*100/isnull(d.Sales, 0) as decimal(10,2)) as varchar(50))+'%' end 
 as 环比 from SalesDetail c left join
 (select a.DepartName as DepartName, a.Sales as Sales, a.SalesDate as lsSalesDate, b.SalesDate as SalesDate from SalesDetail a join SalesDetail b on a.SalesDate=DateAdd(month, -1, b.SalesDate) and a.DepartName=b.DepartName) d

on c.SalesDate=d.SalesDate and c.DepartName=d.DepartName

-- 得到同比

select c.DepartName as 部门, convert(varchar(10), c.SalesDate, 23) as 对比年月, 
 c.Sales as 本月销售总量, d.Sales as 去年同期销售总量, 
 case when d.Sales is null or d.Sales=0 then '无穷大' else cast(cast((isnull(c.Sales, 0)-isnull(d.Sales,0))*100/isnull(d.Sales, 0) as decimal(10,2)) as varchar(50))+'%' end as 同比 
 from SalesDetail c left join
 (select a.DepartName as DepartName, a.Sales as Sales, a.SalesDate as lsSalesDate, b.SalesDate as SalesDate from SalesDetail a join SalesDetail b on a.SalesDate=DateAdd(year, -1, b.SalesDate) and a.DepartName=b.DepartName) d

on c.SalesDate=d.SalesDate and c.DepartName=d.DepartName

-- SQL语句说明

//获取根据时间获取去年同期时间
select DateAdd(year, -1, SalesDate)

//获取根据时间获取上月时间
select DateAdd(month, -1, SalesDate)

//获取根据时间获取去年同期时间数据
select a.DepartName as DepartName, a.Sales as Sales, a.SalesDate as lsSalesDate, b.SalesDate as SalesDate 
 from SalesDetail a join SalesDetail b on a.SalesDate=DateAdd(year, -1, b.SalesDate) 
 and a.DepartName=b.DepartName

//获取根据时间获取上月时间数据
select a.DepartName as DepartName, a.Sales as Sales, a.SalesDate as lsSalesDate, b.SalesDate as SalesDate 
 from SalesDetail a join SalesDetail b on a.SalesDate=DateAdd(month, -1, b.SalesDate) 
 and a.DepartName=b.DepartName

猜你喜欢

转载自blog.csdn.net/qq_42363032/article/details/108724753