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

Laravel中如何统计数据表单行已填充字段数量以计算学生任务完成率

单条记录非空字段统计方案

参考信息

页面视图
数据表结构

原理说明

你使用的COUNT()是表级聚合函数,作用是统计符合条件的总行数,无法实现单条记录内部的非空字段计数,需要对单个字段做非空判断后累加得到结果。

分场景实现

1. SQL查询时直接计算

通用SQL写法,适配所有数据库:

SELECT 
    学生ID,
    学生姓名,
    -- 逐字段判断非空后求和,得到已完成任务数
    (CASE WHEN 任务1 IS NOT NULL AND 任务1 != '' THEN 1 ELSE 0 END
    + CASE WHEN 任务2 IS NOT NULL AND 任务2 != '' THEN 1 ELSE 0 END
    + CASE WHEN 任务3 IS NOT NULL AND 任务3 != '' THEN 1 ELSE 0 END
    -- 有多少个任务字段就对应加多少个判断项
    + CASE WHEN 任务N IS NOT NULL AND 任务N != '' THEN 1 ELSE 0 END) AS 已完成任务数,
    -- 总任务数按实际字段数量填写
    N AS 总任务数,
    -- 计算完成占比,保留两位小数
    ROUND(
        (CASE WHEN 任务1 IS NOT NULL AND 任务1 != '' THEN 1 ELSE 0 END
        + CASE WHEN 任务2 IS NOT NULL AND 任务2 != '' THEN 1 ELSE 0 END
        + CASE WHEN 任务3 IS NOT NULL AND 任务3 != '' THEN 1 ELSE 0 END
        + CASE WHEN 任务N IS NOT NULL AND 任务N != '' THEN 1 ELSE 0 END) / N * 100,
        2
    ) AS 完成占比
FROM 你的学生任务表名;

如果使用MySQL可以简化写法,布尔判断会自动转换为1/0直接求和:

SELECT 
    学生ID,
    学生姓名,
    ((任务1 IS NOT NULL AND 任务1 != '')
    + (任务2 IS NOT NULL AND 任务2 != '')
    + (任务3 IS NOT NULL AND 任务3 != '')
    + (任务N IS NOT NULL AND 任务N != '')) AS 已完成任务数,
    ROUND(
        ((任务1 IS NOT NULL AND 任务1 != '')
        + (任务2 IS NOT NULL AND 任务2 != '')
        + (任务3 IS NOT NULL AND 任务3 != '')
        + (任务N IS NOT NULL AND 任务N != '')) / N * 100,
        2
    ) AS 完成占比
FROM 你的学生任务表名;

2. 代码层面处理(以Python Pandas为例)

如果已经把表数据读取到DataFrame中,可直接按行统计非空值:

import pandas as pd

# df为读取到的学生任务数据表
# 筛选出所有任务字段,排除学生ID、姓名等非任务字段
task_columns = ["任务1", "任务2", "任务3", ... , "任务N"]

# 统计每行任务列的非空值数量
df["已完成任务数"] = df[task_columns].notna().sum(axis=1)
# 计算完成占比,保留两位小数
df["完成占比"] = round(df["已完成任务数"] / len(task_columns) * 100, 2)

注意事项

如果任务字段存在未完成、0这类逻辑空值,把上述判断条件调整为对应规则即可,比如改为任务1 != '未完成'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:45:04