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

Laravel按商品ID、年月分组统计入库总量出现重复数据如何解决

问题原因

  • 未添加指定年份的过滤条件,$tahunx 参数没有正确生效,你之前把过滤逻辑错误写到了 DB::raw 的参数中,并没有实际生效
  • DATE_FORMAT 输出的格式不符合你预期的月份-年份格式,原代码用的是空格分隔,你需要的是横杠分隔
  • 若你的tgl_masuk字段是字符串类型(存储格式为DD-MM-YYYY),直接用DATE_FORMAT无法正确解析日期,需要先转换为日期类型
  • 分组字段和查询返回的非聚合字段需要完全对应,避免MySQL的ONLY_FULL_GROUP_BY模式报错

修正代码

情况1:tgl_masuk字段为date/datetime类型(推荐存储格式)

$tahunx = '2021';
$barangmasuk = BarangMasuk::select([
        'id_barang',
        DB::raw("DATE_FORMAT(tgl_masuk, '%M-%Y') as tgl_masuk"),
        DB::raw('SUM(jml_bm) as sum_jml_bm')
    ])
    // 筛选指定年份的数据
    ->whereRaw('YEAR(tgl_masuk) = ?', [$tahunx])
    // 按商品ID和月份分组
    ->groupBy('id_barang', 'tgl_masuk')
    ->get();
dd($barangmasuk);

情况2:tgl_masuk字段为varchar字符串类型

$tahunx = '2021';
$barangmasuk = BarangMasuk::select([
        'id_barang',
        DB::raw("DATE_FORMAT(STR_TO_DATE(tgl_masuk, '%d-%m-%Y'), '%M-%Y') as tgl_masuk"),
        DB::raw('SUM(jml_bm) as sum_jml_bm')
    ])
    ->whereRaw('YEAR(STR_TO_DATE(tgl_masuk, "%d-%m-%Y")) = ?', [$tahunx])
    ->groupBy('id_barang', 'tgl_masuk')
    ->get();
dd($barangmasuk);

注意事项

如果执行时报ONLY_FULL_GROUP_BY相关错误,可确认MySQL配置的sql_mode中是否移除了该规则,或确保groupBy的字段与select中所有非聚合函数字段完全一致,上述代码已经适配了该规则的要求,执行后的返回结果会完全匹配你给出的预期统计格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 20:27:03