何罗鱼国际货运业务管理系统的大数据图表里会按月展示收入、支出以及利润图表供管理层决策参考,并有实时计算同比、环比增长或下降比例,同比的算法比较好理解,但环比算法还真要琢磨一下。
同比的计算公式:
同比率=(本期数-同期数)÷|同期数|×100%
同比是以年为维度去做比较,比如今年的第 N 个月(本期数)与去年的第 N 个月(同期数)的比较。
例子:
比如说某货代公司去年3月的利润为100万,本年3月的利润为150万,同比增长是怎么算?
同比增长率=(150-100)÷|100|=50%
注意这个绝对值哟,这个很关键的,代码里没有加的话,当利润为负数时,结果就很有意思了。
环比的计算公式:
环比率=(本期数-上期数)÷|上期数|×100%
看环比的英文写法,大概就可以理解环比是以月为维度做比较的。
但我们在开发的时候却遇到了问题(也许我们想多了,但代码总要写清楚):如何定义上期数?我们讨论了两种不同的方案:
先举例子:
比如说某货代公司本年的利润如下:
月份 | 利润 |
1月 | 100万 |
2月 | 150万 |
3月 | 80万 |
4月 | 200万 |
根据计算公式我们可以很方便地算出月度的环比:
2月环比(1月)增长了:(150-100)÷|100|=50%
同理3月环比(2月)下降了46.67%;4月环比(3月)增长了150.00%。
但在系统实际使用中,月份是可以多选的,当选中的月份为3月和4月的时候,合计利润280万,问题就出现了,上期数是多少?(280-#)÷|#|=#%
方案一:
上期数=100 150=250万,就是3月 4月的环比(1月 2月)增长=(280-250)÷|250|=12%,这个方案理解起来相对简单,相邻周期作比较,但总感觉这和 Month on Month 不太相符,另外还会有一个问题,当你选择了本年1-12月的时候,得出的环比值就和同比值相同了,网上搜一下,其实很多网友也有这个疑惑:年度的同比与环比怎么算?
方案二:
上期数=150 80=230万,就是3月 4月的环比(2月 3月)增长=(280-230)÷|230|=21.74%,这个理解起来就有点绕了,但好像是可以解释 Month on Month 这种叫法,就是以月度为基数去计算增长。
declare @start_date date --开始时间
declare @end_date date --结束时间
dateadd(month,-1, @Start_date) –环比开始时间
dateadd(month,-1,@End_date) –环比结束时间
选择哪一种方案呢?