LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

如何用SQL计算报表中多列字段的平均值?(含空值处理)

admin
2025年3月25日 9:26 本文热度 330
在之前的文章:数据统计必备技能:掌握SQL聚合函数的使用方法!中,有提到过求平均值的函数AVG的使用。

不同于之前的AVG函数的使用(只对单列求平均值),今天的分享是如何用SQL计算报表中多列字段的平均值。

01
问题场景和数据准备
假设某在线教育平台需要统计学生的平均成绩,但存在以下复杂情况:学生可能缺考某些科目(成绩为空),不同学生参加考试的科目数量不同。
问题:求每个学生的平均分数,其中平均分数 = 总分/实际参加考试科目数,而非固定除以总科目数。
案例报表如下,建表语句见文末:
02
SQL实现
假如每个列都没有空值的话,那么上面报表中5列的平均值等于(math_score+chinese_score+english_score+physics_score+chemistry_score)/5,那要统计每行非空列的数量就不是固定的5列了。

要解决上面的问题,就需要统计一下三个指标数量:

  • 非空列分数之和:将 NULL 转换为 0 后累加

  • 非空列数量:将 NULL 转换为 0 ,非NULL转换成1后累加

  • 平均分数:非空列分数之和/非空列数量,注意要避免分母为0导致报错

SQL如下:

SELECT     student_name,    -- 计算总分(忽略NULL)    (COALESCE(math_score, 0+      COALESCE(chinese_score, 0+      COALESCE(english_score, 0+      COALESCE(physics_score, 0+      COALESCE(chemistry_score, 0)) AS total_score,
    -- 计算非空列数量    (CASE WHEN math_score IS NOT NULL THEN 1 ELSE 0 END +     CASE WHEN chinese_score IS NOT NULL THEN 1 ELSE 0 END +     CASE WHEN english_score IS NOT NULL THEN 1 ELSE 0 END +     CASE WHEN physics_score IS NOT NULL THEN 1 ELSE 0 END +     CASE WHEN chemistry_score IS NOT NULL THEN 1 ELSE 0 ENDAS valid_columns,
    -- 动态计算平均值(处理分母为0的情况)    CASE WHEN         (CASE WHEN math_score IS NOT NULL THEN 1 ELSE 0 END +         CASE WHEN chinese_score IS NOT NULL THEN 1 ELSE 0 END +         CASE WHEN english_score IS NOT NULL THEN 1 ELSE 0 END +         CASE WHEN physics_score IS NOT NULL THEN 1 ELSE 0 END +         CASE WHEN chemistry_score IS NOT NULL THEN 1 ELSE 0 END= 0     THEN NULL     ELSE         (COALESCE(math_score, 0+          COALESCE(chinese_score, 0+          COALESCE(english_score, 0+          COALESCE(physics_score, 0+          COALESCE(chemistry_score, 0))         /         (CASE WHEN math_score IS NOT NULL THEN 1 ELSE 0 END +         CASE WHEN chinese_score IS NOT NULL THEN 1 ELSE 0 END +         CASE WHEN english_score IS NOT NULL THEN 1 ELSE 0 END +         CASE WHEN physics_score IS NOT NULL THEN 1 ELSE 0 END +         CASE WHEN chemistry_score IS NOT NULL THEN 1 ELSE 0 END)    END AS avg_scoreFROM   data_learning.student_scores;
查询结果如下:

大多数数据库支持CASE表达式和COALESCE函数,所以基本上可以选择上述的SQL代码来解决问题。

部分数据库支持IF、NULLIF函数等,也可以用这些函数来简化上述代码。
SELECT     student_name,    -- 计算总分(忽略NULL)    (COALESCE(math_score, 0+      COALESCE(chinese_score, 0+      COALESCE(english_score, 0+      COALESCE(physics_score, 0+      COALESCE(chemistry_score, 0)) AS total_score,
    -- 计算非空列数量    (IF(math_score IS NOT NULL , 1 , 0 ) +    IF(chinese_score IS NOT NULL  , 1 , 0 ) +    IF(english_score IS NOT NULL  , 1 , 0 ) +    IF(physics_score IS NOT NULL  , 1 , 0 ) +    IF(chemistry_score IS NOT NULL  , 1 , 0 )) AS valid_columns,
    -- 动态计算平均值(处理分母为0的情况)    CASE WHEN         (IF(math_score IS NOT NULL , 1 , 0 ) +        IF(chinese_score IS NOT NULL  , 1 , 0 ) +        IF(english_score IS NOT NULL  , 1 , 0 ) +        IF(physics_score IS NOT NULL  , 1 , 0 ) +        IF(chemistry_score IS NOT NULL  , 1 , 0 )) = 0     THEN NULL     ELSE         (COALESCE(math_score, 0+          COALESCE(chinese_score, 0+          COALESCE(english_score, 0+          COALESCE(physics_score, 0+          COALESCE(chemistry_score, 0))         /         (IF(math_score IS NOT NULL , 1 , 0 ) + IF(chinese_score IS NOT NULL  , 1 , 0 ) + IF(english_score IS NOT NULL  , 1 , 0 ) + IF(physics_score IS NOT NULL  , 1 , 0 ) + IF(chemistry_score IS NOT NULL  , 1 , 0 ))
    END AS avg_scoreFROM   data_learning.student_scores;
附录
建表和插入示例数据语句:
-- 请根据所使用的数据库灵活调整数据类型create table data_learning.student_scores(    student_name varchar(255),    math_score INT,    chinese_score INT,    english_score INT,    physics_score INT,    chemistry_score INT);
insert into data_learning.student_scores values('林赛'9085NULL7892),   -- 林赛,缺考英语('张三'NULLNULLNULLNULLNULL),  -- 张三,全缺考('李四'7588928580),   -- 李四,全科参考('王五'80NULL908070);     -- 王五,缺考语文


该文章在 2025/3/25 9:47:04 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved