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

Laravel:分组百分比求和的实现方法疑问

按组计算百分比并求和的Laravel实现方案

嘿,我完全懂你的需求——原来的代码是算整体的百分比,但现在要按每个小组单独计算百分比再相加,而且数据量会持续增长,手动写一堆变量肯定不是长久之计对吧?

咱们用分组查询+循环遍历的方式就能搞定,不管以后新增多少组都不用改代码,一步到位。具体实现步骤如下:

1. 先批量获取每个组的统计数据

首先用Laravel的分组查询,一次性把每个组的「总人数(safe_voters)」和「符合cipher_id=0的人数(members)」查出来。这里假设你的分组字段是group_id(如果实际业务里的分组字段不是这个,换成你对应的字段就行,比如区域ID、类别ID之类的):

// 查询每个组的核心统计数据:总人数、符合条件的人数
$groupStats = AddMember::with('settlement')
    ->whereHas('settlement', function($query) {
        $query->where('reon_id', '1');
    })
    ->where('town_id', Auth::user()->town_id)
    ->selectRaw('
        group_id, 
        COUNT(*) as safe_voters, 
        SUM(CASE WHEN cipher_id = 0 THEN 1 ELSE 0 END) as members
    ')
    ->groupBy('group_id')
    ->get();

这段代码里的关键逻辑:

  • COUNT(*)统计每个组的总人数(对应你原来的safe_voters)
  • SUM(CASE...)精准统计该组内cipher_id=0的人数(对应你的members)
  • groupBy('group_id')确保每个组的数据单独成一条记录,不会混在一起

2. 遍历计算每组百分比并累加总和

接下来初始化一个总和变量,遍历每个组的统计数据,计算完单组百分比后直接累加到总和里:

$final_percentage = 0;

foreach ($groupStats as $stat) {
    // 必须加这个判断!避免某个组总人数为0时出现除以0的致命错误
    if ($stat->safe_voters > 0) {
        $percent = round(($stat->members / $stat->safe_voters) * 100, 1);
        $final_percentage += $percent;
    }
}

这样不管你后续新增多少组,循环都会自动处理,完全不用手动新增变量,完美适配数据增长的场景。

举个例子验证

就拿你给出的示例数据来说:

  • 组1:safe_voters=6,members=3 → 百分比50.0
  • 组2:safe_voters=9,members=3 → 百分比33.3
  • 组3:safe_voters=12,members=3 → 百分比25.0
  • 最终总和就是50.0 + 33.3 + 25.0 = 108.3(你例子里写的9应该是笔误啦😉)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:01:35