关于SQL求同比、环比

同比和环比的意思

  • 同比

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

  • 环比

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

同比和环比的计算公式

  • 同比发展速度

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

  • 同比增长速度

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

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

  • 环比增长率

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

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

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

  • 同比增长率

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

同比和环比的区别

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

表结构

在这里插入图片描述

1.得到同比数据

在这里插入图片描述

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

评论 1 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:猿与汪的秘密 设计师:我叫白小胖 返回首页

打赏作者

WGS.

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值