专栏首页SQL实现SQL 计算账户余额

SQL 计算账户余额

有一张简单的账户表 t_account,它记录了每次支出(或收入)的金额,只是缺了余额字段,我们需要在每笔账单后面计算出当时的账户余额。t_account 的部分数据:

    id  op      amount  
------  ------  --------
     1  in          1000
     2  exp          124
     3  exp           68
     4  exp          256
     5  in            88
     6  in           200
     7  exp           11
     8  exp          404

其中,id 越大表示这条记录产生的时间越近,op 字段是操作类型,‘in’ 表示收入,‘exp’ 表示支出,amount 是每次操作的金额。

具体来说,当 id = 1 时,账户上增加了 1000,此时余额是 1000;

当 id = 2 时,账户减去了 124,此时余额是 1000 - 124 = 876;

当 id = 3 时,账户又减去了 68,此时余额是 1000 - 124 - 68 = 808;

直到 id = 5,账户上才又有了一笔收入,此时余额是 1000 - 124 - 68 - 256 + 88 = 640 。

最终算到 id = 8 时,账户的余额是 425 。

实际上,当 id = x 时,它余额就是将 id 小于等于 x 的所有记录的 amount 累加,如果遇到 op 的类型是 ‘exp’ 的记录,则相应的加法操作变成减法。

话不多说,直接上 SQL 。

SELECT 
  *,
  (SELECT 
    SUM(IF(op = 'exp', - 1 * amount, amount)) 
  FROM
    t_account b 
  WHERE b.id <= a.id) AS balance 
FROM
  t_account a

结果呈现 >>>

    id  op      amount  balance  
------  ------  ------  ---------
     1  in        1000  1000     
     2  exp        124  876      
     3  exp         68  808      
     4  exp        256  552      
     5  in          88  640      
     6  in         200  840      
     7  exp         11  829      
     8  exp        404  425      

如果用窗口函数,那累加的写法会更简单些。

SELECT 
  *,
  SUM(IF(op = 'exp', - 1 * amount, amount)) 
  OVER (ORDER BY id) AS balance 
FROM
  t_account a 

本文分享自微信公众号 - SQL实现(gh_684ee9235a26),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 以太坊查看账户余额

    用户1408045
  • PostgreSQL·账户表/余额表/消费储蓄表

    本文节选自《Netkiller Architect 手札》 4.22.3. 账户表/余额表/消费储蓄表 此表适用于购物车等金钱来往账面等等。 -- Tabl...

    netkiller old
  • Power Pivot中多账户如何显示余额?

    按照上一篇的理论,用同样的LastDate和LastnonBlank做计算会产生什么样的结果呢?

    逍遥之
  • Power Pivot中多账户如何显示余额?(修正)

    按照上一篇的理论,用同样的LastDate和LastnonBlank做计算会产生什么样的结果呢?

    逍遥之
  • 最基础的账户余额要怎么在 mysql 实现?

    如果现在 a 和 b 互相不设防,无论 a 和 b 是什么事务隔离级别(除了序列化),最终结果都可能是错误的

    执生
  • 万级TPS亿级流水-中台账户系统架构设计

    我们需要给所有前台业务提供统一的账户系统,用来支撑所有前台产品线的用户资产管理,统一提供支持大并发万级TPS、亿级流水、数据强一致、风控安全、日切对账、财务核算...

    王清培
  • SAP MM MIGO过账报错 - 用本币计算的余额 - 之对策

    业务背景是,业务创建了一个退货采购订单,退货给国外供应商。退货之前,业务人员做了批次分割,根据业务实际,退货数量是由8个批次组成。由于单位换算的缘故,每个退货批...

    会玩SAP的金哥哥
  • 干货 | 多业务线亿级体量,携程是怎么做账务中台的

    本文为联合撰文,作者团队负责携程集团支付账务系统、消费金融账务系统、清结算和对账等工作的的开发、设计和运维工作。

    携程技术
  • C++银行管理系统设计分析及程序设计介绍

    qt版本:账号和密码保存于后台数据库,根据输入的账号和密码,查询如正确,则登录成功,若不正确,则提示账户或密码错误(为了安全起见,只有3次机会),并且设有找回密...

    花狗Fdog
  • 万级TPS亿级流水-中台账户系统架构设计

    我们需要给所有前台业务提供统一的账户系统,用来支撑所有前台产品线的用户资产管理,统一提供支持大并发万级TPS、亿级流水、数据强一致、风控安全、日切对账、财务核算...

    王清培
  • TDSQL 全时态数据库系统 -- 典型案例

    增量抽取、增量计算等都是T-TDSQL的经典案例。如下以增量计算为例,来分析T-TDSQL在腾讯金融业务中的典型应用。

    腾讯技术工程官方号
  • 【商城应用】用户余额体系设计

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    林老师带你学编程
  • Spring JDBC-Spring事务管理之数据库事务基础知识

    在使用Spring开发应用时,Spring的事务管理可能是被使用最多、应用最广的功能。 Spring不但提供了和底层事务源无关的事务抽象,还提供了声明性事务的功...

    小小工匠
  • 核心交易链路架构设计与演进

    随着双11进入千亿时代,电商平台正在向“全球化,娱乐互动化,无线化,全渠道”发展。

    春哥大魔王
  • SQL 计算累积销售额

    有一张销售记录表 t_sales,它记录了公司在某个年份的销售记录。由于一些原因,目前只能看到两个字段:month 和 quantity,它们分别对应的中文描述...

    白日梦想家
  • Sql Server 存储过程中查询数据无法使用 Union(All)

      微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询。

    张传宁IT讲堂
  • 用python实现银行转账功能

    py3study
  • 为数据赋能:腾讯TDSQL分布式金融级数据库前沿技术

    本次分享,基于数据库事务处理的核心技术并发访问控制技术,TDSQL原创性提出了全态数据的概念和基于历史态数据的可见性判断算法,并基于此实现了全时态数据库。

    腾讯技术工程官方号
  • JDBC事务控制管理

    今天是学习计划的第二天,感觉自己的学习热情还是很高涨的啊,那我们就趁热打铁,开始今天的学习。 今天的学习内容是JDBC的事务控制管理。 首先是概念性的内容 ...

    wangweijun

扫码关注云+社区

领取腾讯云代金券