如何在Laravel PHP中编写子查询对数据集按agent_id分组求和
Laravel 按字段分组求和实现方案
按照你的实际数据来源,可选择两种对应实现方式:
数据为数据库中存储的记录
这类场景不需要手动拼接嵌套子查询,Laravel 查询构造器原生支持分组聚合逻辑,完全匹配你提到的 SQL 语义:
use Illuminate\Support\Facades\DB; // 直接对数据表做分组聚合 $result = DB::table('你的原始数据表') ->select( 'agent_id', // 显式将字符串类型的amount转为数值后求和,匹配结果格式 DB::raw("SUM(CAST(amount AS SIGNED)) AS amount") ) ->groupBy('agent_id') ->get() ->toArray();
如果需要把前置逻辑查出的临时结果集作为子查询包裹(比如原始数据来自多表关联、复杂筛选的临时数据集),可使用fromSub方法实现嵌套子查询结构:
$result = DB::query() ->fromSub(function ($query) { // 这里填写生成4条原始数据的前置查询逻辑 $query->from('原始业务数据表') ->select('agent_id', 'amount') ->where('筛选条件', 'xxx'); }, 'temp_dataset') // 将前置查询结果别名为临时表 temp_dataset ->select( 'agent_id', DB::raw("SUM(CAST(amount AS SIGNED)) AS amount") ) ->groupBy('agent_id') ->get() ->toArray();
注意:如果你的数据表中
amount字段本身就是整数/浮点数类型,可直接用DB::raw('sum(amount) as amount'),不需要额外做类型转换,避免数据库隐式转换导致的结果偏差。
数据为内存中已存在的数组/集合
如果你的原始4条数据是已经加载到PHP内存中的数组(即示例中的JSON结构),不需要走数据库查询,直接用Laravel集合方法处理即可:
$originalDataset = collect([ ['agent_id' => 'D01', 'amount' => '2'], ['agent_id' => 'D01', 'amount' => '2'], ['agent_id' => 'A01', 'amount' => '1'], ['agent_id' => 'A01', 'amount' => '1'], ]); $result = $originalDataset ->groupBy('agent_id') ->map(fn($groupData, $agentId) => [ 'agent_id' => $agentId, 'amount' => (string) $groupData->sum(fn($item) => (int) $item['amount']) ]) ->values() ->toArray();
上述两种方式执行后,均可得到你示例中的预期结果格式。
内容的提问来源于stack exchange,提问作者Wei Kang
相关产品推荐
相关产品推荐

