mysql 计算同比、环比,查询结果拼接成列、行、

一、理论

国家统计局同比、环比计算公式
增长速度是反映经济社会某一领域发展变化情况的重要数据,而同比和环比是反映增长速度最基础、最核心的数据指标,也是国际上通用的指标。在统计中, 同比和环比通常是同比变化率和环比变化率的简称,用于表示某一事物在对比期内发展变化的方向和程度。

一、同比基本概念

同比是以上年同期为基期相比较,即本期某一时间段与上年某一时间段相比, 可以理解为今年第 n 月与去年第 n 月的比较。如,2019 年 12 月份与 2018 年 12 月份相比较,2019 年上半年与 2018 年上半年相比较就是同比。同比增长率是指本期和上一年同期相比较的增长率,计算公式为:同比增长率=(本期数-同期数)/同期数×100%。例如,某公司 2019 年上半年利润 3000 万元,为本期数, 同期数就是 2018 年上半年的利润 2000 万元,同比增长率为(3000 - 2000)/ 2000×100% = 50%,即某公司 2019 年上半年利润同比增长 50%。

二、环比基本概念

环比是与上一个相邻统计周期相比较,表明统计指标逐期的发展变化 , 可以理解为第 n 月与第 n-1 月的比较。如,2019 年 12 月份与 2019 年 11 月份相比较,2019 年 1 月份与 2018 年 12 月份相比较就是环比。环比增长率是指本期和上期相比较的增长率,计算公式为:环比增长率 =(本期数-上期数)/上期数 ×100%。例如,某公司 2019 年 6 月份营业额为 100 万元,为本期数,上期数就是 2019 年 5 月份营业额 80 万元,环比增长率为(100 - 80)/ 80×100% =25%,即某公司 2019 年 6 月份营业额环比增长 25%。

三、同比和环比的应用

环比侧重反映数据的短期变化。用环比增长速度反映指标变化时,时效性强, 比较灵敏。比如,对居民消费价格指数(CPI)的环比涨跌幅进行分析,可以判断短期内物价变化的方向(上升或下降)。环比的不足之处是,对一些随着季节变化而波动的指标,将当期的数据直接与上期相比时,容易受到季节因素的干扰, 使得用其反映的增长速度波动往往较大。比如,由于“双十一”促销影响,11 月份网上零售额相比 10 月份增加较多,而 12 月份网上零售额相比 11 月份会减少较多,相应地,11 月份的环比增长速度会比较高,而 12 月份的环比增长速度就可能是负的,但这并不能说明网上零售额发生了趋势性变化。所以进行环比计算之前一般需要先把经济指标变动中的季节性因素剔除掉,即进行季节调整后,再计算环比增长速度。

同比相对于环比,侧重反映长期趋势,能够一定程度上克服季节性波动的影响。比如,同样是“双十一”促销,使用同比增长速度,10 月、11 月、12 月的波动不会像环比波动那样大,主要由于上年与今年11 月“双十一”促销因素均存在。但另一方面,同比增长速度的缺点是易于受基期因素影响,比如,上年基期受灾害影响,数据波动大,而今年同期未受灾害影响,则同比增长速度会表现出波动变化。

总之,同比和环比所反映的虽然都是变化速度,但由于对比基期不同,反映的内涵完全不同。一般来说,环比可以与环比相比较,而不能拿同比与环比相比较。但是,对于同一个领域,当既要考虑历史发展趋势,又要考虑短期变化时,则应把同比与环比放在一起进行对照分析。

来源:国家统计局 (撰稿:付凌晖 沈丽文)

行SQL

SELECT
	MAKEDATE(now.report_year,1) AS report_time,
	SUM( now.report_value ) AS totalProfit,
	now_sub_query.operatingRevenue AS operatingRevenue,
	( SUM( now.report_value ) / now_sub_query.operatingRevenue )* 100 AS "利润率" 
FROM
	company_target_report now
	INNER JOIN ( SELECT report_year, SUM( report_value ) AS operatingRevenue FROM company_target_report WHERE company_calculate_name = '' AND target_calculate_name = 'operatingRevenue' AND report_year = '${report_year}' GROUP BY report_year ) now_sub_query ON now.report_year = now_sub_query.report_year 
WHERE
	now.company_calculate_name = '' 
	AND now.target_calculate_name = 'totalProfit' 
	AND now.report_year = '${report_year}' 
GROUP BY
	now.report_year,
	now_sub_query.operatingRevenue
UNION ALL
SELECT
	MAKEDATE(now.report_year,1) AS report_time,
	SUM( now.report_value ) AS totalProfit,
	now_sub_query.operatingRevenue AS operatingRevenue,
	( SUM( now.report_value ) / now_sub_query.operatingRevenue )* 100 AS "利润率" 
FROM
	company_target_report now
	INNER JOIN ( SELECT report_year, SUM( report_value ) AS operatingRevenue FROM company_target_report WHERE company_calculate_name = '' AND target_calculate_name = 'operatingRevenue' AND report_year = '${report_year}'-1 GROUP BY report_year ) now_sub_query ON now.report_year = now_sub_query.report_year 
WHERE
	now.company_calculate_name = '' 
	AND now.target_calculate_name = 'totalProfit' 
	AND now.report_year = '${report_year}'-1
GROUP BY
	now.report_year,
	now_sub_query.operatingRevenue;

mysql 计算同比、环比,查询结果拼接成列、行、_第1张图片

SELECT
	now_data.report_time,
	now_data.company_calculate_name,
	now_data.now_totalProfit,
	before_data.before_totalProfit ,
	((now_data.now_totalProfit - before_data.before_totalProfit) / before_data.before_totalProfit) * 100 AS "increase_rate"
FROM
	(
	SELECT
	  MAKEDATE(now_query.report_year,1) AS report_time,
		now_query.company_calculate_name,
		SUM( report_value ) AS "now_totalProfit" 
	FROM
		company_target_report now_query 
	WHERE
		now_query.company_calculate_name = '' 
		AND now_query.target_calculate_name = 'totalProfit' 
		AND now_query.report_type = '月' 
		AND now_query.report_year = 2023
	GROUP BY
		now_query.report_year 
	) AS now_data
	INNER JOIN (
	SELECT
		before_query.company_calculate_name,
		SUM( report_value ) AS "before_totalProfit" 
	FROM
		company_target_report before_query 
	WHERE
		before_query.company_calculate_name = '' 
		AND before_query.target_calculate_name = 'totalProfit' 
		AND before_query.report_type = '月' 
		AND before_query.report_year = 2023-1
	GROUP BY
	before_query.report_year 
	) AS before_data ON now_data.company_calculate_name = before_data.company_calculate_name;

在这里插入图片描述

你可能感兴趣的:(mysql,数据库)