• SQL 同比环比计算公式及实例演示
千次阅读
2021-04-01 23:48:21

同比数据计算公式：

同比：一般情况下是今年第n月与去年第n月比
计算方式：同比增长率=（本期数－同期数）
÷同期数×100%
所以要有个本期数据与同期数据一一对应的表，那就要本期数据与同期数据分离

环比数据计算公式：
环比：一般是指报告期水平与前一时期水平之比，此处指本月数据与上月数据（或者本日数据与上日数据）
计算方式：环比增长速度=（本期数－上期数）÷上期数×100%

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 * from SalesDetail

-- 计算环比
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同比环比

2022-01-04 14:08:24
描述 数据来源使用frdemo的订单明细和订单表 效果图 ...三、在SQL计算同环比，不在单元格内计算与过滤 select t.m,t.ym, t.销量, t1.销量 同期, (case when t1.销量 is null then...

描述 数据来源使用frdemo的订单明细和订单表

效果图

一、下拉框选择年份参数筛选

select distinct strftime('%Y',订购日期) as year from 订单 order by year asc

条件属性隔行变色

三、在SQL中计算同环比，不在单元格内计算与过滤

select t.m,t.ym,

t.销量,

t1.销量 同期,

(case when t1.销量 is null then ''

else (t.销量-t1.销量)/t1.销量 end) 同比,

t2.销量 上期,

(case when t2.销量 is null then ''

else (t.销量-t2.销量)/t2.销量 end) 环比

from

(

select strftime('%m',b.订购日期)+0 m,

strftime('%Y-%m',b.订购日期) ym,

sum(a.数量) 销量

from 订单明细 a

left join 订单 b on a.订单ID=b.订单ID

where strftime('%Y',b.订购日期) = '1997'

group by strftime('%Y-%m',b.订购日期)

) t   -- 1997年 m月份 ym年月 销量 销售额

left join

(

select strftime('%m',b.订购日期)+0 m,

strftime('%Y-%m',b.订购日期) ym,

sum(a.数量) 销量

from 订单明细 a

left join 订单 b on a.订单ID=b.订单ID

where strftime('%Y',b.订购日期) = '1996'

group by strftime('%Y-%m',b.订购日期)

) t1 on t.m=t1.m  -- 1996 年 m月份 ym年月 销量 销售额

left join

(

select (case when strftime('%m',b.订购日期)+0 <=11

then strftime('%m',b.订购日期)+1 end) m, -- 1997年 使用then判断 ym中月份小于等于11 将月份+1

strftime('%Y-%m',b.订购日期) ym,

sum(a.数量) 销量

from 订单明细 a

left join 订单 b on a.订单ID=b.订单ID

where strftime('%Y',b.订购日期) = '1997'

group by strftime('%Y-%m',b.订购日期)

union

select (case when strftime('%m',b.订购日期)+0 =12

then 1 end) m,

strftime('%Y-%m',b.订购日期) ym,

sum(a.数量) 销量

from 订单明细 a

left join 订单 b on a.订单ID=b.订单ID

where strftime('%Y',b.订购日期) = '1996'

group by strftime('%Y-%m',b.订购日期)

) t2 on t.m=t2.m

四、比例为负时加粗标红

颜色+字体 没有生效

背景颜色 + 字体 生效

解决方法 条件属性分开设置

先加粗 先显示红色 先后顺序好像导致最终显示有所出入 (咱也不知道这是为啥)

需要先加粗显红才能达到下图显示效果

如果是先显红 后加粗 最终结果显示只是加粗的情况

五、标题随年份动态显示

将三、步骤中年份替换参数名

展开全文
• SQL同比环比增长率计算

千次阅读 2019-11-08 14:14:08
同比： SELECT DISTINCT B.dateM,B.dateY,B.Total,B.Total+B.Total*AVG( B.per ) OVER ( PARTITION BY B.dateM ) as predictionTotal , AVG( B.per ) OVER ( PARTITION BY B.dateM ) AS [AvgPer] ,MA...

同比：

SELECT DISTINCT
B.dateM,B.dateY,B.Total,B.Total+B.Total*AVG( B.per ) OVER ( PARTITION BY B.dateM ) as predictionTotal
,    AVG( B.per ) OVER ( PARTITION BY B.dateM ) AS [AvgPer]
,MAX( B.per ) OVER ( PARTITION BY B.dateM ) AS [MaxPer]
,Min( B.per ) OVER ( PARTITION BY B.dateM ) AS [MinPer] from
(SELECT A.dateM,A.dateY
,A.[Total] - A.[PreviousTotal] as GrowthTotal,(A.[Total] - A.[PreviousTotal])/A.[PreviousTotal] as per,A.[Total]
,    A.[Month]
FROM
(
select s.dateM,dateY,COUNT(*) OVER ( PARTITION BY s.dateM ) AS [Month],s.[Total]  AS [Total]
,     LAG( s.[Total] ) OVER ( PARTITION BY s.dateM ORDER BY s.dateY ) AS [PreviousTotal]
from (SELECT datepart(mm,[month]) as dateM, datepart(yyyy,[month]) as dateY,sum([Total]) Total
FROM [KS_DataBase3.0_QJ].[dbo].[KS_MonthVbt] where [Month]>='2017' and [Month]<'2019'
GROUP BY [month]) s
) AS A
) B

环比计算比较简单

SELECT o.*
FROM (SELECT o.*,
(total / LAG(total) OVER (ORDER BY month) - 1) as growth
FROM [KS_DataBase3.0_QJ].[dbo].[KS_MonthVbt] o
) o
WHERE [Month] <= '2019-10-01'
ORDER BY [Month];

展开全文
• 关于SQL求同比、环比

千次阅读 2020-09-22 09:49:21
同比环比的意思 同比 ...同比环比计算公式 同比发展速度 同比发展速度 = 本期发展水平 / 去年同期水平 × 100% 同比增长速度 同比增长速度 =（本期发展水平-去年同期水平）/ 去年同期

同比和环比的意思

• 同比

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

• 环比

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

同比和环比的计算公式

• 同比发展速度

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

• 同比增长速度

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

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

• 环比增长率

（本期数-上期数）/上期数×100%

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

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

• 同比增长率

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

同比和环比的区别

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

建表

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 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


展开全文
• sql语句下的同比，环比操作

万次阅读 多人点赞 2020-07-01 00:44:26
需求：查询2020年,每月的销售额,以及同比环比,并按照年月进行升序排序 建数据库 建表 插入数据 偷个懒，这些语句就先省略了 给看个截图 ps: 建表时时间要选择datetime ,后面要对时间进行操作的~ 思路：分步操作 ...
• 800 2006-8-1 6 营销一部 400 2007-7-1 7 营销二部 800 2007-7-1 8 营销三部 700 2007-8-1 9 营销一部 600 2008-7-1 10 营销二部 300 2008-7-1 2、要根据要求得到以下数据 1）得到同比数据 部门 ...
• sum和case when的结合使用 ...如果我们需要求男生的人数是女生的多少倍怎么计算？ 3.求男生的人数是女生的多少倍（sum和case when的结合使用） select "男生人数", "女生人数", "男生人数" /
• 统计各个景区的入园人数、销售额以及入园人数和销售额的同比 以月度为例子同比为例；环比类似 思路分析：表a首先统计出当月的入园人数、销售额，表b统计出同期的入园人数、销售额（在a的基础上减去一年，可），...
• sqlserver 计算同比,环比增长

千次阅读 2019-09-27 02:30:03
同比增长 order by fdSequenceID,id asc   环比增长： WITH f AS ( SELECT ROW_NUMBER() OVER ( partition by fdSequenceID ORDER BY fdTime) AS id, * FROM [ NewDBTest...
• Hive实现同比环比计算

千次阅读 2022-02-25 11:50:00
Hive实现同比环比计算同比环比的计算销售量的月年占比同比环比lead lag 的实现自关联的实现 同比环比的计算 测试数据 1,2020-04-20,420 2,2020-04-04,800 3,2020-03-28,500 4,2020-03-13,100 5,2020-02-27,300 6,...
• SQL计算日环比、周同比

千次阅读 2019-11-10 20:43:45
计算环比、周同比 范例表格如下： 这是面试问到的一个问题，回来学习之后了解可以用这个函数： 代码如下： select date,gmv,(gmv-gmv_1)/gmv_1,(gmv-gmv_7)/gmv_7 from (select date,gmv, lead(gmv,1) over...
• Mysql计算同比环比(超详细)

千次阅读 热门讨论 2020-09-11 20:52:17
sql如下 CREATE TABLE sales ( 产品ID int NOT NULL, 销售数量 int(20) , 销售时间 timestamp(6) NULL DEFAULT NULL, PRIMARY KEY (订单ID) ) INSERT INTO sales VALUES ('C1001', 15, '2020-06-01 ...
• Java计算同比环比

千次阅读 2020-08-31 14:39:28
Java计算同比环比 同比环比计算基本概念和计算公式 同比率：本年数据比上一年数据增长或减少的比率 同比率计算公式：rate = (本年数据 - 前一年数据) / 前一年数据 实例：2020年10月游客数量为80W，2019年10月游客...
• ORACLE计算同比环比

千次阅读 多人点赞 2020-07-06 14:19:18
同比环比概念和公式 同比: 同比一般情况下是今年第n月与去年第n月比 环比: 表示连续2个统计周期（比如连续两月）内的量的变化比。 同比增长率=（本期数-同期数）/|同期数|×100% 环比增长率=（本期数-上期数）/上期...
• 800 2006-8-1 6 营销一部 400 2007-7-1 7 营销二部 800 2007-7-1 8 营销三部 700 2007-8-1 9 营销一部 600 2008-7-1 10 营销二部 300 2008-7-1 2、要根据要求得到以下数据 1）得到同比数据 部门 ...
• 使用 case when 语句计算这张联合表相应列的比值, 即为同比环比数据 实际语句示例: # 计算同比 select s1.id,currDate,currSum currSumFee,prevDate,prevSum prevSumFee, CASE WHEN prevSum>0 THEN (currSum-...
• 稍加分析可知，这是一道典型的求同比环比类型的题目。 知识点梳理同比一般情况下是今年第n月与去年第n月比。同比发展速度主要是为了消除季节变动的影响，用以说明本期发展水平与去年同期发展水平对比而达到的相对...
• 给出某一个日期，用SQL分别计算日、月、季度、年下的同比环比
• 大体思路：MySQL没有类似oracle方便的统计函数，只能靠自己去硬计算：通过时间字段直接增加年份、月份，然后通过left join关联时间字段去计算环比同比公式即可原始表结构：求同比SQL：--按年同比SELECTt5.*,...
• MySQL计算同比和环比

千次阅读 2022-03-17 15:43:50
• 与上年度同月数据对比称"同比"，与上月数据对比称"环比" 同比的话，如果每个月都齐全，都有数据lag(num,12)就可以了，空值的话，使用lag()函数的第三个参数。 select t2.index_name,t2.new_index_code,t2.now_...
• AS PREV_SAL -- 环比分析，与上个月份进行比较 ,LAG(SALARY, 12, 0) OVER(PARTITION BY EMPLOYEENO ORDER BY YEARMONTH) AS PREV_12_SAL -- 同比分析，与上个年度相同月份进行比较 ,SUM(SALARY) OVER(PARTITION BY ...
• 1.普及一下概念环比 = 2018年10月/2018年09月(同一时期内不同时间段的比较)同比 = 2018年10月/2017年10月(不同时期内相同时间段的比较)环比增长率 =(2018年10月-2018年09月)/2018年09月同比增长率 =(2018年10月-2017...
• SQL计算月环比、月同比

千次阅读 2020-08-17 17:51:37
在工作的过程中，经常会使用到环比同比，那关于如何用SQL去写环比同比呢？非常简单，用interval函数，轻松实现。 interval 1 month，环比 interval 1 year ,同比 一、准备数据 为了快速理解，我建了一个表，关于...
• SQL计算月同比、月环比

千次阅读 2021-07-28 15:02:10
SQL 计算同比、月环比情景月环比的计算逻辑月同比计算逻辑详细步骤 情景 查找2019年各个月份的入职以及去年同期的入职，结果包括四列: 【年月，入职人数，上月入职人数，去年同期入职人数】 所用数据： DROP ...

...