今天看到有群友在群里了这个问题,问题描述见下图。这种需求在做报表统计时经常会遇到,会的人觉得不难,没有接触过可能会被困住,所以我把它拿出来和大家分享。

图中已把问题描述清楚,再结合数据看就更清晰了。用算法来描述就是:给定一张表(假设表名叫作 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 累计求和相关推荐

  1. mysql sum按条件求和_SQL 累计求和

    今天看到有群友在群里了这个问题,问题描述见下图.这种需求在做报表统计时经常会遇到,会的人觉得不难,没有接触过可能会被困住,所以我把它拿出来和大家分享. 图中已把问题描述清楚,再结合数据看就更清晰了.用 ...

  2. EXCEL实现表格动态求和与累计求和

    在实际办公的过程中,我们常常需要按月份对数据进行动态求和.累计求和.如果能够用好SUM.OFFSET.MATCH等函数,上述任务非常容易实现. 小提示:以下操作在Excel 2019中完成. 我们以如 ...

  3. sql 纵向求和_SQL语句求和语句该怎么编写?有几种方法?

    SQL语句是数据库的灵魂,下面要给大家介绍的是SQL语句中求和的各种方法,希望对你们有所帮助吧. 一.SQL语句是什么? 了解求和方法之前,我们得先了解SQL语句是什么. SQL是什么? 1.SQL全 ...

  4. sql按客户号累计求和并且排序

    你可以使用以下 SQL 语句来实现按客户号累计求和并排序: SELECT customer_id, SUM(amount) as total_amount FROM table_name GROUP ...

  5. sql 纵向求和_SQL中求和函数SUM()的应用实例

    SQL中的求和函数SUM( )用于对数据求和,返回选取结果集中所有值的总和.下面将为您介绍求和函数SUM( )的语法和应用的实例,供您参考. 语法如下. SELECT          SUM(col ...

  6. sql累计求和时间太长_(七)SQL知识点--窗口函数

    目录 1.窗口函数 1.1定义 窗口函数,即OLAP函数(Online Anallytical Prcessing,联机分析处理),可以对数据库数据进行实时分析处理.具备分组.排序,同时又不减少原表行 ...

  7. sql server累计求和函数_窗口函数 以及 储存过程 create procedure

    窗口函数-常见用法,每组内排名 比如,找出每个部门工资前三高的员工等 什么是窗口函数 窗口函数,OLAP函数,online analytical processing,联机分析处理,可以对数据库数据进 ...

  8. sql 列求和_图解面试题:累计求和问题如何分析?

    [题目] "薪水表"中记录了员工发放的薪水.包含雇员编号,薪水.起始日期.结束日期. 其中,薪水是指该雇员在起始日期到结束日期这段时间内的薪水.当前员工是指结束日期 = '9999 ...

  9. mysql 多条件求和_sql多条件求和-sql条件求和-sql求和且和满足条件

    sql 根据多条件求和 select 日期, sum(产品数) as 产品数, 姓名 from 表名 group by 日期, 姓名 order by 日期, 姓名 用SQL语句对数据库某字段进行求和 ...

最新文章

  1. 读书笔记:《少的力量》
  2. 最多两次股票交易-Best Time to Buy and Sell Stock III
  3. 网狐框架分析八--web登录游戏大厅流程
  4. 金蝶Apusic应用服务器的数据源管理(转)
  5. thinkphp回调的php调用db类,请问thinkphp中model类自动完成功能 回调函数能不能获取其他字段的值?...
  6. MATLAB基础教程(11)——二维中的数据可视化(续)
  7. html 12306页面实现,jQuery模拟12306城市选择框功能简单实现方法示例
  8. 未找到 arp 项。_高新热力公司抢工期保供暖 42项新建改造项目全部完工
  9. sedna进行xquery查询
  10. CORS基础要点:关于dataType、contentType、withCredentials
  11. redis java 视频教程_redis从入门到精通视频教程【50讲全】
  12. python分析视频文件_FLV视频文件格式分析
  13. 用 VC2012 产生脱离VC运行库的 C/C++ 程序
  14. 基于微信小程序的人脸分析学生课堂状态监测系统 文档+项目源码
  15. 沙龙回顾 | 爱盈利运营小咖秀干货系列沙龙之微软站
  16. win7装matlab教程,win7系统怎么安装matlab软件(图文教程)
  17. 土木工程计算机设计考试科目一模拟试题,科目一电脑模拟考试,原来这么简单,看完这个科一不用愁!...
  18. Dev中的GridControl中根据条件显示背景色
  19. (第2课)【初识python爬虫】
  20. 计算机塑性成形论文,6061铝合金的高温变形的力学性能及热塑性成形工艺研究...

热门文章

  1. Show一下拿的奖杯
  2. 在大厂,我和同事搞对象(别人的故事总是这么香)
  3. 激活系统报错——输入错误: 没有文件扩展“.vbs”的脚本引擎
  4. pDC 与 GetDC() 区别
  5. 学习SQLSugar,分享给更多人收益
  6. php 微信支付分 教程
  7. 企业微信集成EAS流程助手
  8. opengl: 太阳地球和月亮
  9. html属于非结构化数据吗,什么是结构化数据非结构化数据和半结构化数据
  10. MySQL实战演练——如何才能构建逾期用户画像?【数据可视化】