【FastAdmin】深入解析SQL查询:准确计算账户余额

作者:田辛老师

1 引言

在这篇博客中,田辛老师将分享如何通过一个相对复杂的SQL查询来解决一个实际的业务需求:计算财务账户的最终余额
这个需求来自于一个学生的提问。 按说这个需求比较简单, 但是她遇到了如下困难。

  1. 账户余额并不是账户表的一个字段,需要根据明细数据实时统计。
  2. 明细数据来源除了交易记录表以外, 还需要考虑转账的数据。
  3. 转账数据是独立的表转账记录表,转账的情况在该表里面有体现,但是转账费还是在交易记录表
  4. 转账数据分为不同状态,只有completed的数据才能被查询出来。
    只有完成了上面4个挑战, 她才能解决这个问题。

2 业务需求

我们的目标是计算每个账户的当前余额,这个余额应该包括所有收入和支出,并且特别要处理账户之间的转账活动。这是财务系统中的常见需求,因为用户需要实时了解每个账户的准确财务状态。
这个需求对老鸟不难, 但是考虑到大三的新手。 这个SQL也是个小坑。

3 基本的表结构

在我们的数据库中,我们主要处理以下几张表:

  1. 账户表 (fa_tdyefm_account)
    • id: 账户ID
    • account_name: 账户名称
  2. 交易记录表 (fa_tdyefm_record)
    • account_id: 关联的账户ID
    • amount: 交易金额
  3. 转账记录表 (fa_tdyefm_transfer)
    • from_account_id: 源账户ID
    • to_account_id: 目标账户ID
    • amount: 转账金额
    • status: 转账状态(‘pending’, ‘completed’, ‘failed’)

4 SQL实现

为了计算每个账户的余额,田辛老师设计了以下SQL查询:

SELECT
    a.id AS AccountID,
    a.account_name AS AccountName,
    COALESCE(SUM(r.amount), 0) +
    COALESCE(SUM(CASE WHEN t.from_account_id = a.id AND t.status = 'completed' THEN -t.amount ELSE 0 END), 0) +
    COALESCE(SUM(CASE WHEN t.to_account_id = a.id AND t.status = 'completed' THEN t.amount ELSE 0 END), 0) AS Balance
FROM
    fa_tdyefm_account a
LEFT JOIN
    fa_tdyefm_record r ON a.id = r.account_id
LEFT JOIN
    fa_tdyefm_transfer t ON (a.id = t.from_account_id OR a.id = t.to_account_id) AND t.status = 'completed'
GROUP BY
    a.id, a.account_name;

5 主要的语法及技术思路

  • COALESCE 函数:确保在没有交易记录的情况下余额显示为0,而不是NULL。
  • LEFT JOIN:用于连接交易和转账记录,即使某些账户没有交易或转账记录也能被正确处理。
  • CASE 语句:在处理转账金额时,根据当前账户是源账户还是目标账户调整金额的正负,确保只计算状态为“completed”的转账。
  • SUM 函数:用于汇总每个账户的交易和转账金额,计算最终的余额。

6 结论

通过这个相对比较复杂的SQL查询,我们不仅能够提供每个账户的实时余额,还能确保所有的交易和转账都被正确考虑,这对于任何需要精确财务追踪的系统来说都是至关重要的。
希望这个例子能帮助那些在类似项目中遇到挑战的开发者。
如果有任何问题或者想要进一步讨论,欢迎在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/579070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA:运行 Tomcat 报错 “1099”

1、报错的结果 报错 就很明显啊 localhost:1099 端口号被使用了 2、报错原因 tomcat的端口已经被使用,与运行的起了冲突。强制结束项目,但端口号没有被释放短时间内频繁运行tomcat服务器。 3、解决方法 win R 输入 cmd 打开命令框 黑窗口输…

个人学习-前端相关(2):ECMAScript 6-箭头函数、rest、spread

ES6的箭头函数 ES6允许使用箭头函数,语法类似java中的lambda表达式 let fun1 function(){} //普通的函数声明 let fun2 ()>{} //箭头函数声明 let fun3 (x) >{return x1} let fun4 x >{return x1} //参数列表中有且只有一个参数,()可…

纯血鸿蒙APP实战开发——预渲染实现Web页面瞬开效果

介绍 为了便于大家在使用本案例集时能够更详细的了解各个案例,本案例基于Web预渲染实现了案例介绍功能,即应用右下角的问号icon。 效果图预览 使用说明 因为直接加载的线上README,因此本功能需联网使用点击icon,即会弹出对应案…

Docker容器部署overleaf

overleaf在线版限制很多,好在开源,准备在本地Docker部署,网上翻了翻,似乎本地部署并非易事,我也尝试了一下,发现直接使用docker-compose拉官方最新镜像部署的确问题很多,不过最终还是完美解决。…

如何借模板助力小程序开发

不论是奶茶店还是其他行业,想要开发小程序,乔拓云都为你提供了便捷的方案。无需复杂的编程技术,通过套用模板的方式,即可快速打造专属小程序。 在线访问乔拓云官方网站,免费注册账号后,即可进入商城小程序的…

C语言学习/复习36

一、程序的环境与预处理 二、翻译环境与执行环境 三、运行环境 四、预编译(预处理)详解

Docker从无到有

主要为windows下docker的安装与使用~ 初始Docker Docker理解 对于docker的加简介,我们可以官网获取它的概念,接下来就从什么是docker、为什么要使用docker以及它的作用来进行一个快速入门 前提:项目在发布时,不仅需要其jar包同…

Open-Sora 升级技术报告解读

最新功能概览 开源地址:https://github.com/hpcaitech/Open-Sora 技术报告:Open-Sora/docs/report_02.md at main hpcaitech/Open-Sora GitHub技术报告: 支持长视频生成;视频生成分辨率最高可达 720p;单模型支持任…

SOL跟单机器人是什么?

SOL跟单机器人是什么? 顾名思义,就是对方买什么我们买什么。。 solana跟单机器人,炒土狗新思路 跟聪明地址买入及卖出 1.跟随目标地址买入代币,比目标地址慢1-2秒内上链 2.上链稳定,采用jito路径,防止被夹 …

【视频打架行为数据集】打斗场景视频数据集简要介绍

一、UBI-Fight(异常事件检测数据集) 介绍 UBI-Fights 数据集是一个独特的全新大型数据集,涉及特定的异常检测并仍然在打斗场景中提供广泛的多样性,该数据集包含 80 小时的视频,在帧级别进行了完全注释。由 1000 个视…

三款数据可视化工具深度解析:Tableau、ECharts与山海鲸可视化

在数字化时代,数据可视化工具成为了企业和个人进行数据分析和决策的重要助手。市面上众多数据可视化工具各具特色,本文将为您介绍三款热门的数据可视化工具,帮助您更好地理解和利用数据。 首先,让我们来认识Tableau。Tableau是一款…

opencv4.8 系列一环境搭搭建

open 运行环境&#xff1a; vs2017 下载地址&#xff1a;https://www.123pan.com/s/cVyRVv-ydPWh.html 一&#xff1a;新建项目 二&#xff1a;核心代码&#xff1a; 在这里插入代码片 #include<opencv2/opencv.hpp>int main(int argc,char** argv) {cv::Mat src cv…

windows服务启动提示‘服务没有响应控制功能’(mysql启动报错)

在安装mysql的时候&#xff0c;在windows服务项启动 或 使用命令net start mysql 时启动是报错&#xff0c;提示 服务没有响应控制功能 发生原因&#xff1a; Windows10 x64 或 更高的操作系统&#xff0c;有些系统缺少一些组件 解决办法&#xff1a; 1、下载最新的 Microsoft …

Mybatis入门-----(1)

Mybaits入门 一、Mybaits框架特点 支持定制化SQL、存储过程、基本路线以及高级映射避免了几乎所有JDBC代码中手动设置参数以及获取结果集支持注解式开发、XML开发 二、开发我第一个MYbatis程序 ①打包方式jar ②引入依赖 mybatis依赖mysql驱动 前面两步的pom.xml文件<?…

如何在自己的网站页面中嵌入一个【悬浮音乐播放器】

如何嵌入【悬浮音乐播放器】 前言正文1.打开网易云网页版2.设置自己想要的高度和宽度看注意事项 3.选择是否为自动播放4.在header.php文件中</head>标签前插入下面代码5.在heard.php 中<body>标签后边增加一个 div层6.复制播放器代码到\<div>标签的里边7.保存…

AD修改元器件的引脚长度

这个地方的两个引脚长度不一样 双击其中的一个引脚。 修改这个位置就好了。

Docker学习(二十五)构建 Arthas 基础镜像

目录 一、简介二、构建基础镜像2.1 下载 Arthas2.2 编写 Dockerfile2.3 构建镜像2.4 创建容器2.5 测试 一、简介 Arthas 是一款由 阿里巴巴 开发的 线上监控诊断工具。通过全局视角实时查看应用负载、内存、GC、线程等信息&#xff0c;能在不修改代码的情况下&#xff0c;对业…

SUPIR图像放大模型介绍与实际测试

✨背景 正如&#xff0c;最顶级的料理只需要最简单的烹饪方法一样&#xff0c;图像放大&#xff0c;是设计领域里边最常面对的一个问题&#xff0c;在AI绘画里边也是很常见的一个课题。虽然现在放大算法、放大模型有很多&#xff0c;但是真的能实现的比较好的&#xff0c;并不…

语义分割——json文件转shp

前言 在用labelme标注遥感图像后会生成json文件&#xff0c;如果我们想要shp文件&#xff0c;下面给出了具体实现流程。 一、依赖配置 import json import geopandas as gpd from shapely.geometry import Polygon from osgeo import gdal import argparse import glob import…

【论文解析】笔触渲染生成 前沿工作梳理

最近的一些工作梳理 2023年 Stroke-based Neural Painting and Stylization with Dynamically Predicted Painting Region 2022年Im2Oil: Stroke-Based Oil Painting Rendering with Linearly Controllable Fineness Via Adaptive Sampling 文章目录 1 Stroke-based Neural P…
最新文章