MySQL实现阶段累加的sql写法

本文介绍了一种使用SQL查询来实时计算用户累计充值余额的方法,通过两种不同的SQL写法,展示了如何在每次充值后更新用户的总余额,无需额外的冗余字段,简化了数据维护工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近有一个需求:统计每日充值/消费之后的余额,对于这种需求,其实也很简单,只需要在每次充值/消费后,计算下余额,然后保存下来就可以了。但是对于这种需求,一条sql就能搞定,都不需要做冗余字段

图表展示这个场景可能更直白

需要的结果

写法一:

select t.*
,(select sum(price) from t_charge temp where temp.date <= t.date) as total_price
from t_charge t
group by t.id;

写法二:

select t.*, sum(temp.price) as total_price
from t_charge t,t_charge temp
where t.date <= temp.date
group by t.id;


欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址: http://www.jouypub.com
简书主页: https://www.jianshu.com/u/756c9c8ae984
segmentfault主页: https://segmentfault.com/blog/jouypub
腾讯云主页: https://cloud.tencent.com/developer/column/72548
### SQL中计算多列总和的方法 在SQL查询中,可以通过`SUM()`聚合函数来现对单列或多列数值的求和操作。如果需要针对多个不同的字段分别进行汇总,则可以多次调用`SUM()`函数并将其结果组合到同一行中。 对于多列求和的具体现方式如下: #### 方法一:单独对每一列应用 `SUM()` 这是最常见也是最基本的方式之一,即分别为每列指定一个独立的 `SUM()` 函数表达式。例如,在给定的数据集中有若干表示不同时间段的操作数量(如 `opnum9~12`, `opnum12~15`, 和 `opnum15~18`),可以根据条件筛选出特定的结果类别(比如 “认证通过”,“认证不通过” 或者 “无认证”)再累加其对应的值[^1]。 ```sql SELECT op_time, name, sourcename, SUM(CASE WHEN result='认证通过' THEN opnum9~12 ELSE 0 END) AS opsucc9~12, SUM(CASE WHEN result='认证通过' THEN opnum12~15 ELSE 0 END) AS opsucc12~15, -- 继续定义其他所需列... FROM Atest GROUP BY op_time, name, sourcename; ``` 这里采用了更通用的标准写法——使用 `CASE...WHEN...THEN...ELSE...END` 替代 MySQL 特有的 `IF()` 函数,从而提高跨数据库系统的兼容性。 #### 方法二:利用子查询或者视图简化复杂逻辑 当存在大量重复模式时,考虑创建临时表或视图以减少冗余代码量。假设我们希望先统计各类别下的总计数然后再进一步处理这些中间产物的话,就可以采取这种方法[^3]: ```sql WITH SummedResults AS ( SELECT op_time, name, sourcename, CASE WHEN result='认证通过' THEN (opnum9~12 + opnum12~15 + ...) ELSE 0 END AS total_successes, CASE WHEN result='认证不通过' THEN ... END AS total_failures, ... FROM Atest ) SELECT * FROM SummedResults WHERE some_condition; ``` 此方法不仅有助于保持清晰易读结构而且还能提升性能表现特别是在面对大规模数据集的时候尤为明显。 另外值得注意的是,当我们遇到某些记录可能含有NULL值得情况时候,应该意识到默认情况下任何涉及 NULL 的算术运算都会返回 NULL 而不是预期中的零或其他有效数字;因此建议始终显式的设定替代方案以防万一[^3]. 最后提醒一点关于分组依据的选择非常重要因为它直接影响最终输出形式以及能否满足际业务需求方面的要求[^2]. ### 示例代码展示 下面给出一段综合运用以上技巧的例子: ```sql -- 创建测试表格及其初始数据 CREATE TEMPORARY TABLE IF NOT EXISTS temp_table( category VARCHAR(50), value1 INT DEFAULT 0, value2 INT DEFAULT 0, value3 INT DEFAULT 0 ); INSERT INTO temp_table VALUES ('CategoryA', 10, 20, 30); INSERT INTO temp_table VALUES ('CategoryB', NULL ,40, 50); INSERT INTO temp_table VALUES ('CategoryC', 60,NULL ,70); -- 执行多列求和操作 SELECT COALESCE(SUM(value1),0)+COALESCE(SUM(value2),0)+COALESCE(SUM(value3),0) AS overall_sum FROM temp_table; DROP TABLE temp_table; ``` 该脚本首先建立了一个简单的临时工作区用于演示目的接着展示了如何安全有效地完成整个集合内的所有非空单元格之合计过程. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值