当月数据与上个月的同比增长与上一年当月的环比增长

该博客探讨了如何使用MySQL进行复杂查询,特别是在统计目标月份数据时,如何处理NULL值并计算同比增长率和环比增长率。SQL示例展示了如何连接多个子查询以获取不同时间段的数据,并计算增长率。此外,还分享了日期和时间操作的各种方法,如获取本月、上月和上一年同一月份的第一天和最后一天。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MYSQL查询:统计分别统计目标月份数据,将查询的结果作为查询表进行关联,如果查询结果为null赋值0,分别求出每个月的数据,并算出同比增长率和环比增长率。
需要分别用到以下:

-- 如果sum的值为null赋值0
IFNULL(sum,0)
-- 求取增长率并保留两位小数
CONCAT( ROUND((IFNULL(t.sum,0)-IFNULL(t1.sum,0)) / IFNULL(t1.sum,1) * 100, 2 ), '', '%' )
-- 本月第一天
CONCAT(DATE_FORMAT(LAST_DAY(NOW()),'%Y-%m-'),'01')
-- 本月最后一天
LAST_DAY(NOW())
-- 上个月第一天
CONCAT(DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH),'%Y-%m-'),'01')
-- 上个月最后
LAST_DAY(NOW() - INTERVAL 1 MONTH)
-- 上一年当前月份第一天
CONCAT(DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 YEAR),'%Y-%m-'),'01') 
-- 上一年当前月份最后一天
LAST_DAY(NOW() - INTERVAL 1 YEAR)
-- 其它写法:
-- 本月第一天 RIGHT返回字符串最右边的2个字符就加上了0
CONCAT(YEAR(NOW()),'-',RIGHT(100 + MONTH(NOW()), 2),'-01')
-- 本月最后一天
CONCAT(YEAR(NOW()),'-',RIGHT(100 + MONTH(NOW()), 2),'-31')
-- 上个月第一天
CONCAT(YEAR(NOW()),'-',RIGHT(100 + MONTH(NOW())-1, 2),'-01') 
-- 上个月最后一天
CONCAT(YEAR(NOW()),'-',RIGHT(100 + MONTH(NOW())-1, 2),'-31')
-- 上一年当前月份第一天
CONCAT(YEAR(NOW())-1,'-',RIGHT(100 + MONTH(NOW()), 2),'-01'
-- 上一年当前月份最后一天
CONCAT(YEAR(NOW())-1,'-',RIGHT(100 + MONTH(NOW()), 2),'-31')

其他时间截取:

-- LPAD函数从左边对字符串使用指定的字符进行填充
CONCAT(LPAD(MONTH(TIME), 2, '0')

整体SQL:

SELECT IFNULL(T.SUM,0) AS '当月',IFNULL(T1.SUM,0) AS '上月',CONCAT( ROUND((IFNULL(T.SUM,0)-IFNULL(T1.SUM,0)) / IFNULL(T1.SUM,1) * 100, 2 ), '', '%' ) AS '同比增长/%',
IFNULL(T2.SUM,0) AS '上一年当前月份', 
CONCAT( ROUND((IFNULL(T.SUM,0)-IFNULL(T2.SUM,0)) / IFNULL(T2.SUM,1) * 100, 2 ), '', '%' ) AS '环比增长/%' 
FROM GRADE G 
LEFT JOIN
(SELECT COUNT(1) AS SUM,CLASS_NO AS CLASS_NO FROM STUDENT_INFO 
WHERE 
INPUT_TIME BETWEEN CONCAT(DATE_FORMAT(LAST_DAY(NOW()),'%Y-%m-'),'01') 
AND LAST_DAY(NOW()) 
GROUP BY CLASS_NO ASC LIMIT 12) 
AS T 
ON (G.CLASS_NO=T.CLASS_NO) 
LEFT JOIN 
(SELECT COUNT(1) AS SUM,CLASS_NO AS CLASS_NO FROM STUDENT_INFO 
WHERE 
INPUT_TIME BETWEEN CONCAT(DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH),'%Y-%m-'),'01') 
AND LAST_DAY(NOW() - INTERVAL 1 MONTH)
GROUP BY CLASS_NO ASC LIMIT 12) 
AS T1 
ON (G.CLASS_NO=T1.CLASS_NO) 
LEFT JOIN 
(SELECT COUNT(1) AS SUM,CLASS_NO AS CLASS_NO FROM STUDENT_INFO 
WHERE 
INPUT_TIME BETWEEN CONCAT(DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 YEAR),'%Y-%m-'),'01') 
AND LAST_DAY(NOW() - INTERVAL 1 YEAR) 
GROUP BY CLASS_NO ASC LIMIT 12) 
AS T2 
ON (G.CLASS_NO=T2.CLASS_NO)

在这里插入图片描述

### 计算Hive分区表中当前月和上个月数据同比 在处理时间序列数据分析时,经常需要对比不同时间段内的数据变化情况。对于存储于Hive中的大规模数据集来说,利用其强大的SQL功能可以实现这一目标。 为了计算当前月份前一月份之间的同比增长率,在Hive SQL语句中可以通过`date_format()`函数来提取日期字段中的年份和月份部分,并通过子查询分别获取两个月份的数据总量。之后再进行连接操作完成最终的增长率计算[^1]。 下面是一个具体的例子展示如何执行这样的分析: ```sql WITH current_month AS ( SELECT SUM(some_metric) as cur_sum, date_format(event_time, 'yyyy-MM') as month FROM your_partitioned_table WHERE date_format(event_time, 'yyyy-MM') = date_format(current_date(), 'yyyy-MM') GROUP BY date_format(event_time, 'yyyy-MM') ), last_month AS ( SELECT SUM(some_metric) as last_sum, date_format(event_time, 'yyyy-MM') as month FROM your_partitioned_table WHERE date_format(event_time, 'yyyy-MM') = date_format(date_add(current_date(), -1*dayofmonth(current_date())+1-1), 'yyyy-MM') GROUP BY date_format(event_time, 'yyyy-MM') ) SELECT c.cur_sum, l.last_sum, (c.cur_sum - l.last_sum)/l.last_sum * 100 as growth_rate_percentage FROM current_month c JOIN last_month l ON c.month >= l.month; ``` 此脚本首先定义两个公共表达式CTE(Common Table Expressions),分别为current_month 和 last_month ,用于表示当月以及上一个月的数据汇总结果。最后一步则是将这两个结果集按照月份关联起来,并计算增长百分比[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

engr_chen

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值