当前位置: 首页 > news >正文

MYSQL求月份同比数据和环比数据

1.需求题目如下 

1.使用MonthlyTotals子查询计算每个账户在每个月的总交易金额。这里使用了substr函数将transaction_date字段的前7个字符提取为年份和月份,并使用SUM函数计算每个账户每个月的总金额。

2.利用表自关联,获取上月,上年对应月份及金额

使用LaggedMonthlyTotals子查询将每个月的总交易金额与相邻月和相同月的总交易金额进行连接。这里使用了两个左连接,分别连接相邻月的总金额和相同月的总金额。连接条件使用了日期函数和字符串处理函数将当前月份前一个月和前一年的同一月计算出来,并与对应的账户进行匹配。

关联条件利用 主表月份-1个月=上月月份 和 主表月份-1年=上年月份

3.使用最外层的查询从LaggedMonthlyTotals中选择账户ID、月份、总金额以及计算出的环比和同比百分比。环比百分比使用了一个CASE语句进行计算,如果前一个月的总金额存在,则将当前月的总金额减去前一个月的总金额,除以前一个月的总金额,并乘以100。同样,同比百分比的计算方式类似。

最后,按照账户ID和月份进行排序,并返回结果。

附代码及测试数据

CREATE TABLE transactions (  transaction_id VARCHAR(255),  account_id VARCHAR(255),  amount DECIMAL(10, 2),  transaction_date DATE  
);INSERT INTO transactions (transaction_id, account_id, amount, transaction_date) VALUES  
('0C', 'C1', 100.00, '2021-01-15'),  
('10', 'C1', 150.00, '2021-02-15'),  
('01', 'C2', 200.00, '2021-03-15'),  
('02', 'C2', 250.00, '2021-04-15'),  
('03', 'C1', 300.00, '2022-01-20'),  
('04', 'C1', 350.00, '2022-02-20'),  
('05', 'C2', 400.00, '2021-02-18'),  
('06', 'C2', 450.00, '2021-03-18'),  
('07', 'C1', 500.00, '2021-04-18'),  
('08', 'C2', 550.00, '2022-02-18');WITH MonthlyTotals AS (SELECTaccount_id,substr(transaction_date,1,7) AS month_year,SUM(amount) AS total_amountFROMtransactionsGROUP BYaccount_id,substr(transaction_date,1,7)
),
LaggedMonthlyTotals AS (SELECTmt.account_id,mt.month_year,mt.total_amount,sy.month_year as month_year_sy,sn.month_year as month_year_sn,sy.total_amount as prev_month_amount,sn.total_amount as prev_year_same_month_amountFROMMonthlyTotals mtleft join MonthlyTotals sy on mt.account_id=sy.account_id and DATE_FORMAT(  DATE_SUB(STR_TO_DATE(CONCAT(mt.month_year, '-01'), '%Y-%m-%d'), INTERVAL 1 Month ), '%Y-%m')=sy.month_yearleft join MonthlyTotals sn on mt.account_id=sn.account_id and DATE_FORMAT(  DATE_SUB(STR_TO_DATE(CONCAT(mt.month_year, '-01'), '%Y-%m-%d'), INTERVAL 1 YEAR ), '%Y-%m')=sn.month_year
)
SELECTlmt.account_id,lmt.month_year,lmt.total_amount,-- 计算环比百分比CASEWHEN lmt.prev_month_amount IS NULL THEN NULLELSE ((lmt.total_amount - lmt.prev_month_amount) / lmt.prev_month_amount) * 100END AS 环比,-- 计算同比百分比CASEWHEN lmt.prev_year_same_month_amount IS NULL THEN NULLELSE ((lmt.total_amount - lmt.prev_year_same_month_amount) / lmt.prev_year_same_month_amount) * 100END AS 同比
FROMLaggedMonthlyTotals lmtorder by account_id,month_year;

相关文章:

  • 【步联科技身份证】 身份证读取与解析———未来之窗行业应用跨平台架构
  • 深度学习应用详解
  • 叶国富“推翻”马云新零售,零售新王此刻登基?
  • 线性基学习DAY2
  • 【libp2p——NAT】
  • ansible学习之 Facts
  • 平安养老险肇庆中心支公司开展“2024年金融教育宣传月”活动
  • matlab-批处理图像质量变化并形成折线图 (PSNR)
  • HarmonyOs 查看官方文档使用弹窗
  • 【C/C++】错题记录(二)
  • 0代码、自动化,让AI视觉算法赋能千行百业(含源代码)
  • 敢不敢动手?AI绘画+表情包制作,7步搞定超萌表情!
  • Linux Mint急救模式
  • (undone) MIT6.824 Lab1
  • 【华为HCIP实战课程二】OSPF基础介绍和OSPF RID NBMA配置详解
  • 【5+】跨webview多页面 触发事件(二)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Django 博客开发教程 8 - 博客文章详情页
  • Flex布局到底解决了什么问题
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Javascript 原型链
  • Java多态
  • JDK 6和JDK 7中的substring()方法
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • 爱情 北京女病人
  • 测试如何在敏捷团队中工作?
  • 后端_ThinkPHP5
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习ES6 变量的解构赋值
  • 用jQuery怎么做到前后端分离
  • 做一名精致的JavaScripter 01:JavaScript简介
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​ArcGIS Pro 如何批量删除字段
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • (2)MFC+openGL单文档框架glFrame
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (回溯) LeetCode 131. 分割回文串
  • (十一)手动添加用户和文件的特殊权限
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)u-boot-nand.bin的下载
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net core docker部署教程和细节问题
  • .net dataexcel winform控件 更新 日志
  • .net FrameWork简介,数组,枚举
  • .NET 解决重复提交问题
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • @Autowired注解的实现原理
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @RunWith注解作用