Laravel中按id分组实现jml列累计求和生成total列的问题
解决按ID分组的累计求和问题
原代码的问题分析
groupBy('id')->sum('jml')会直接返回每个ID对应的jml总合计,而非逐行的累计值,无法满足"当前及之前同ID行累加"的需求。- 直接对这个总合计值加上新输入的
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
相关产品推荐
相关产品推荐

