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
相关产品推荐
相关产品推荐

