You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中按id分组实现jml列累计求和生成total列的问题

解决按ID分组的累计求和问题

原代码的问题分析

  1. groupBy('id')->sum('jml') 会直接返回每个ID对应的jml总合计,而非逐行的累计值,无法满足"当前及之前同ID行累加"的需求。
  2. 直接对这个总合计值加上新输入的jml,得到的是该ID的最终总和,不是当前新行的累计值。

解决方案一:查询时用SQL窗口函数直接计算累计值(推荐)

利用数据库的窗口函数,在查询阶段直接生成每行的累计total,效率更高且逻辑清晰。需要确保表中有排序依据(如created_at或自增主键),保证累计顺序正确:

$logs = DB::table('logs')
    ->selectRaw('id, jml, SUM(jml) OVER (PARTITION BY id ORDER BY created_at) AS total')
    ->orderBy('id')
    ->orderBy('created_at')
    ->get();
  • PARTITION BY id:按ID分组计算累计
  • ORDER BY created_at:指定同ID组内的行顺序,确保累计是按时间先后(或你需要的顺序)进行
  • SUM(jml) OVER (...):窗口函数,自动计算当前行及之前同组行的jml累加和

解决方案二:插入新数据时计算当前行的累计值

如果需要在插入新记录时直接存储total值,可以先查询该ID已有的jml总和,再加上新输入的jml:

// 获取当前ID已有的jml总和
$existingSum = DB::table('logs')->where('id', $request->id)->sum('jml');
// 计算当前新行的累计total
$currentTotal = $existingSum + $request->jml;

// 插入新记录
DB::table('logs')->insert([
    'id' => $request->id,
    'jml' => $request->jml,
    'total' => $currentTotal,
    'created_at' => now(),
    'updated_at' => now(),
]);

内容的提问来源于stack exchange,提问作者syafaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:00:01