You need to enable JavaScript to run this app. 如何在Laravel PHP中编写子查询对数据集按agent_id分组求和
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 22:36:06