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

求助:按月分组计算Finance与Accounting数据集的差值

月度分组数据差值计算方案

方法一:数据库层面直接计算(推荐,效率更高)

通过子查询分别获取两个表的月度聚合数据,再通过月份和单位关联,直接计算差值,同时用COALESCE处理空值(避免某一月仅单表有数据时出现null)。

$difference = DB::table(
    DB::raw("(SELECT 
                SUM(cost) as finances_monthly,
                unit,
                DATE_FORMAT(date,'%M %Y') as month
              FROM finances
              WHERE unit = ? AND date BETWEEN ? AND ?
              GROUP BY month, unit) as finance_data")
)
->leftJoin(
    DB::raw("(SELECT 
                SUM(deposite) as deposites_monthly,
                unit,
                DATE_FORMAT(payment_date,'%M %Y') as month
              FROM accountings
              WHERE unit = ? AND payment_date BETWEEN ? AND ?
              GROUP BY month, unit) as accounting_data"),
    function($join) {
        $join->on('finance_data.month', '=', 'accounting_data.month')
             ->on('finance_data.unit', '=', 'accounting_data.unit');
    }
)
->setBindings([$unit, $start_date, $end_date, $unit, $start_date, $end_date])
->select(
    'finance_data.month',
    'finance_data.unit',
    DB::raw('COALESCE(accounting_data.deposites_monthly, 0) - COALESCE(finance_data.finances_monthly, 0) as monthly_difference')
)
->orderBy('finance_data.month')
->get();

方法二:Laravel集合层面处理

如果已经获取了$data1和$data2,可以通过集合的键匹配、合并月份的方式计算差值:

  1. 将两个数据集转换为以月份为键的关联数组:
$financeMap = $data1->keyBy('months')->toArray();
$accountingMap = $data2->keyBy('month')->toArray();
  1. 提取所有涉及的月份,避免遗漏:
$allMonths = array_unique(array_merge(
    array_keys($financeMap),
    array_keys($accountingMap)
));
  1. 遍历计算每个月的差值:
$monthlyDifferences = collect($allMonths)->map(function($month) use ($financeMap, $accountingMap, $unit) {
    $cost = $financeMap[$month]['finances_monthly'] ?? 0;
    $deposit = $accountingMap[$month]['deposites_monthly'] ?? 0;
    
    return [
        'month' => $month,
        'unit' => $unit,
        'monthly_difference' => $deposit - $cost
    ];
})->sortBy('month')->values();

注意事项

  • 若需保证月份排序准确,建议查询时先使用%Y-%m格式(如DATE_FORMAT(date,'%Y-%m') as month)进行分组和排序,之后再转换为%M %Y格式展示,避免英文月份名排序混乱。
  • 需确保两个表的unit字段值完全匹配,否则关联会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:25:26