sql 纵向求和_SQL 累计求和
今天看到有群友在群里了这个问题,问题描述见下图。这种需求在做报表统计时经常会遇到,会的人觉得不难,没有接触过可能会被困住,所以我把它拿出来和大家分享。
图中已把问题描述清楚,再结合数据看就更清晰了。用算法来描述就是:给定一张表(假设表名叫作 t),t 表有字段(oid,period,amount,balance),对同一时期(period 字段的值相等)的金额(amount)按 oid 的顺序做累加求和操作,累加的结果放到 balance 字段。
结合数据来看,在原始数据中,当 oid = 1 时,amount = 3500.00,由于此时只有一条记录,所以 balance = 3500.00 ;当 oid = 2 时,amount = 5100.00,balance = 3500.00 + 5100.00 = 8600.00;同理,当 oid = 3 时,balance = 3500.00 + 5100.00 + 10000.00 = 18600.00 。
我们通过自关联来实现累计求和的结果,关联的条件可以这么写 t as t1 INNER JOIN t as t2 ON t2.period = t1.period AND t2.oid <= t1.oid。其中,t1 是主表,用来限定 t2 可以累加的数据的范围。比如,当 t1.oid = 5 时,t2.oid 只能是(4,5),对应的 balance 的计算过程就是 2560.00(t2.oid = 4 时的 amount) + 4700.00(t2.oid = 5 时的 amount) 。
完整的 SQL 就可以这么写:
WITH t AS
(SELECT
1 AS oid,
2009 AS period,
3500.00 AS amount,
0.00 AS balance
UNION
SELECT
2 AS oid,
2009 AS period,
5100.00 AS amount,
0.00 AS balance
UNION
SELECT
3 AS oid,
2009 AS period,
10000.00 AS amount,
0.00 AS balance
UNION
SELECT
4 AS oid,
2010 AS period,
2560.00 AS amount,
0.00 AS balance
UNION
SELECT
5 AS oid,
2010 AS period,
4700.00 AS amount,
0.00 AS balance)
# 上面的是造数据的SQL,下面这段才是核心实现SELECT
t1.oid,
t1.period,
t1.amount,
SUM(t2.amount) AS balance
FROM
t AS t1
LEFT JOIN t AS t2
ON t2.period = t1.period
AND t2.oid <= t1.oid
GROUP BY t1.oid,
t1.period,
t1.amount ;
看不惯自连接的写法可以换成标量子查询:
SELECT
oid,
period,
amount,
(SELECT
SUM(amount)
FROM
t
WHERE period = t1.period
AND oid <= t1.oid) AS balance
FROM
t AS t1
如果你的 MySQL 环境是 8.0 及其以上,可以尝试使用窗口函数。
SELECT
oid,
period,
amount,
SUM(amount) over (PARTITION BY period
ORDER BY oid) AS balance
FROM
t
实现累计求和差不多就是这些写法。如果你有不同的实现方式,欢迎在评论区留言,和大家分享你的思路。
来源:SQL实现
作者:zero
sql 纵向求和_SQL 累计求和相关推荐
- mysql sum按条件求和_SQL 累计求和
今天看到有群友在群里了这个问题,问题描述见下图.这种需求在做报表统计时经常会遇到,会的人觉得不难,没有接触过可能会被困住,所以我把它拿出来和大家分享. 图中已把问题描述清楚,再结合数据看就更清晰了.用 ...
- EXCEL实现表格动态求和与累计求和
在实际办公的过程中,我们常常需要按月份对数据进行动态求和.累计求和.如果能够用好SUM.OFFSET.MATCH等函数,上述任务非常容易实现. 小提示:以下操作在Excel 2019中完成. 我们以如 ...
- sql 纵向求和_SQL语句求和语句该怎么编写?有几种方法?
SQL语句是数据库的灵魂,下面要给大家介绍的是SQL语句中求和的各种方法,希望对你们有所帮助吧. 一.SQL语句是什么? 了解求和方法之前,我们得先了解SQL语句是什么. SQL是什么? 1.SQL全 ...
- sql按客户号累计求和并且排序
你可以使用以下 SQL 语句来实现按客户号累计求和并排序: SELECT customer_id, SUM(amount) as total_amount FROM table_name GROUP ...
- sql 纵向求和_SQL中求和函数SUM()的应用实例
SQL中的求和函数SUM( )用于对数据求和,返回选取结果集中所有值的总和.下面将为您介绍求和函数SUM( )的语法和应用的实例,供您参考. 语法如下. SELECT SUM(col ...
- sql累计求和时间太长_(七)SQL知识点--窗口函数
目录 1.窗口函数 1.1定义 窗口函数,即OLAP函数(Online Anallytical Prcessing,联机分析处理),可以对数据库数据进行实时分析处理.具备分组.排序,同时又不减少原表行 ...
- sql server累计求和函数_窗口函数 以及 储存过程 create procedure
窗口函数-常见用法,每组内排名 比如,找出每个部门工资前三高的员工等 什么是窗口函数 窗口函数,OLAP函数,online analytical processing,联机分析处理,可以对数据库数据进 ...
- sql 列求和_图解面试题:累计求和问题如何分析?
[题目] "薪水表"中记录了员工发放的薪水.包含雇员编号,薪水.起始日期.结束日期. 其中,薪水是指该雇员在起始日期到结束日期这段时间内的薪水.当前员工是指结束日期 = '9999 ...
- mysql 多条件求和_sql多条件求和-sql条件求和-sql求和且和满足条件
sql 根据多条件求和 select 日期, sum(产品数) as 产品数, 姓名 from 表名 group by 日期, 姓名 order by 日期, 姓名 用SQL语句对数据库某字段进行求和 ...
最新文章
- 读书笔记:《少的力量》
- 最多两次股票交易-Best Time to Buy and Sell Stock III
- 网狐框架分析八--web登录游戏大厅流程
- 金蝶Apusic应用服务器的数据源管理(转)
- thinkphp回调的php调用db类,请问thinkphp中model类自动完成功能 回调函数能不能获取其他字段的值?...
- MATLAB基础教程(11)——二维中的数据可视化(续)
- html 12306页面实现,jQuery模拟12306城市选择框功能简单实现方法示例
- 未找到 arp 项。_高新热力公司抢工期保供暖 42项新建改造项目全部完工
- sedna进行xquery查询
- CORS基础要点:关于dataType、contentType、withCredentials
- redis java 视频教程_redis从入门到精通视频教程【50讲全】
- python分析视频文件_FLV视频文件格式分析
- 用 VC2012 产生脱离VC运行库的 C/C++ 程序
- 基于微信小程序的人脸分析学生课堂状态监测系统 文档+项目源码
- 沙龙回顾 | 爱盈利运营小咖秀干货系列沙龙之微软站
- win7装matlab教程,win7系统怎么安装matlab软件(图文教程)
- 土木工程计算机设计考试科目一模拟试题,科目一电脑模拟考试,原来这么简单,看完这个科一不用愁!...
- Dev中的GridControl中根据条件显示背景色
- (第2课)【初识python爬虫】
- 计算机塑性成形论文,6061铝合金的高温变形的力学性能及热塑性成形工艺研究...