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

Laravel中按entry_id合并两行数据并新增对应金额列的方案

解决方案:合并同一entry_id的收支记录为单行

你可以用条件聚合(结合CASE WHEN与聚合函数)来实现需求,这种方式能把同一entry_id的in和out记录合并为单行,生成的查询可以直接作为子查询使用,完全替代你之前尝试的GROUP_CONCAT方案。

原生SQL子查询写法

直接写出可作为子查询的SQL语句,逻辑清晰且兼容性强:

SELECT
    entry_id,
    MAX(CASE WHEN type = 'in' THEN amount ELSE NULL END) AS in_amount,
    MAX(CASE WHEN type = 'out' THEN amount ELSE NULL END) AS out_amount
FROM entry_entities
GROUP BY entry_id

你可以把这段SQL当作子查询嵌入到其他语句中,比如:

SELECT *
FROM (
    SELECT
        entry_id,
        MAX(CASE WHEN type = 'in' THEN amount ELSE NULL END) AS in_amount,
        MAX(CASE WHEN type = 'out' THEN amount ELSE NULL END) AS out_amount
    FROM entry_entities
    GROUP BY entry_id
) AS merged_entries
-- 可添加筛选、关联等逻辑
WHERE in_amount > 100;

Laravel Query Builder实现(支持子查询)

用Laravel的查询构造器写出等效代码,方便集成到业务逻辑中:

// 构建子查询
$mergedSubquery = DB::table('entry_entities')
    ->select(
        'entry_id',
        DB::raw('MAX(CASE WHEN type = "in" THEN amount ELSE NULL END) AS in_amount'),
        DB::raw('MAX(CASE WHEN type = "out" THEN amount ELSE NULL END) AS out_amount')
    )
    ->groupBy('entry_id');

// 将子查询用于主查询的示例
$finalResult = DB::table($mergedSubquery, 'merged')
    ->select('entry_id', 'in_amount', 'out_amount')
    // 可添加筛选条件
    ->where('in_amount', '>', 50)
    ->get();

补充说明

  • 为什么不用GROUP_CONCAT:GROUP_CONCAT是将多个值拼接成字符串,无法直接生成独立的数值列,不符合你需要in_amount和out_amount两个字段的需求。
  • 聚合函数选择:因为你提到同一entry_id对应in和out各一条记录,用MAX或SUM效果一致;如果后续同一entry_id可能出现多条同类型记录,把MAX换成SUM即可实现金额累加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:30:17