公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

如何用SQL計算報表中多列字段的平均值?(含空值處理)

admin
2025年3月25日 9:26 本文熱度 513
在之前的文章:數據統計必備技能:掌握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

主站蜘蛛池模板: av免费观看无码 | 91无码人妻精品一区 | 国产白丝喷水娇喘视频 | 国产精品丝袜综合区 | 精品一区二区三区盗摄 | 国产精品无码久久久 | 国产在线观看精 | 国产午夜片无码区在线观看爱情 | 国产福利一区在 | 国产91高清免费 | 国产色综合一区二区三区 | 精品日韩欧美一区在线播放不 | 国产一级aaaaa免费播放 | 91午夜在线免费观看小视频 | 成人午夜看黄在 | 国产亚洲欧美免费视频 | 国产一区二区免费视频 | 国产一区在线播放网址 | 91成人啪国产啪永久地址 | 成在人线av无码高潮喷水 | 国产无码黄色网站在线观看 | 国产丰满美女a级毛片 | 国产成人欧美在线视频 | 国产亚洲大尺度无码无码专线 | 精品国产96亚洲一区 | 国产毛片黄色美女视频 | 国产精品蜜臀无码福利久久 | 国产美女白嫩嫩在线观看 | 2025年国产理论在线观看 | 国产毛片情侣视频 | 果冻国产成人av高清在线 | 国产av无码一级麻 | 2025国产精品香蕉在线观看 | 成人精品午夜无码免费视小黄人 | 国产人妖在线 | 国产免费日本高清 | 国产二区交换配乱婬 | 国产精品人成人免 | 国产成人毛片无码视频软件 | 国产成人精品综合久久久久 | 国产一区二区三区免费高清在线 |