场景描述
在做数据分析时,经常会需要展示同比和环比的数据,可以通过 SQL 来完成同比和环比的计算,再配合数据可视化工具进行展示,每个月都会自动展示当月数据与上月的对比(环比),以及当月数据与去年同期数据的对比(同比);
效果展示
我先看一下将同比、环比的数据放到数据看板上的效果图:
上图是将某公司的销售数据做了同比和环比分析后,通过报表展示出来的效果,包含:线上线下销量的同比环比、各大区的销量月环比。
实现过程
测试数据预览
以下是我们分析的原始数据,数据来源于真实业务记录,所以部分数据进行了遮挡处理;
我们重点关注的数据:
- 每条数据代表一单销售业绩;
- “类型” 包含线上、线下;
- “成交日期” 是分析依据;
- “大区” 也是要分析的内容。
SQL实现过程
我们以 “线上销量的月环比” 做SQL实现步骤讲解
先统计每个月的线上销量
select DATE_FORMAT(日期,'%Y-%m') as date, count(*) as 累计销量 from renwu where 类型 = '线上' GROUP BY date
我们需要在每个月累计销量 后面 显示一列上月的销量:
select t.date tdate ,t.累计销量 本月销量 ,y.累计销量 上月销量
from
(select DATE_FORMAT(日期,'%Y-%m') as date, count(*) as 累计销量 from renwu where 类型 = '线上' GROUP BY date) t
left JOIN
(select DATE_FORMAT(DATE_ADD(日期,INTERVAL 1 MONTH),'%Y-%m') as date, count(*) as 累计销量 from renwu where 类型 = '线上' GROUP BY date) y
on t.date = y.date
最后就可以通过 “本月销量” 和 “上月销量” 计算环比了;
计算公式为:(本月销量 - 上月销量) / 上月销量 *100%
select t.date tdate ,t.累计销量 本月销量 ,y.累计销量 上月销量,
case
when y.累计销量 is null or y.累计销量 = 0 then 0.00
else round((t.累计销量 - y.累计销量) / y.累计销量, 4)
end ratio
from
(select DATE_FORMAT(日期,'%Y-%m') as date, count(*) as 累计销量 from renwu where 类型 = '线上' GROUP BY date) t
left JOIN
(select DATE_FORMAT(DATE_ADD(日期,INTERVAL 1 MONTH),'%Y-%m') as date, count(*) as 累计销量 from renwu where 类型 = '线上' GROUP BY date) y
on t.date = y.date
计算结果中的 “ratio” 就是计算的环比,这里保留了4位小数,是为了在报表中转化为百分比再保留两位小数。
我们只需要展示最新月份的环比,所以不需要把所有数据都列出来,只需要展示最新月份的一条数据即可,做最后的优化:
以上是环比计算的过程,同比计算只需要将增加的 “上月数据” 改为 “去年数据“ 即可
”DATE_FORMAT(DATE_ADD(日期,INTERVAL 1 MONTH),'%Y-%m')”
改为
”DATE_FORMAT(DATE_ADD(日期,INTERVAL 1 YEAR),'%Y-%m')”
展示同比环比
在 DataEase 的仪表板编辑界面,将SQL 的计算数据放到一个指标卡中显示即可,显示类型选择为 百分比显示,效果如下: