首页 > 解决方案 > 忽略平均数学中的空值,但在结果中显示为零

问题描述

我需要计算Average字段的值,但需要做两件事:

1- 空值不应计入平均数学。
2-如果该字段为空,它仍然必须显示在结果中(平均 === 0)

想象一下,我有这个数据集:

-----------------------
Code | valField | Date
-----------------------
  A  |          | 2020-09-08
  B  |  12      | 2020-09-09
  A  |  10      | 2020-09-08
  B  |  15      | 2020-09-09
  B  |          | 2020-09-09
  C  |          | 2020-09-09

所以我需要day. 如您所见,我们有:
A = { empty, 10 }
B = { 12, 15, empty }
C = { empty }

我需要这样取平均值:
A 的平均值 = 10
B 的平均值 = (12+15)/2 (因为我们有 2 个非空值)
C 的平均值 = 0 (它没有一个值,但我需要它在结果上显示为 0)

到目前为止,我可以完成这两个要求,但不能同时完成。

此查询将显示空值但也将计算空字段average math

SELECT AVG(valField) FROM myTable;

所以 B 的平均值 = (12+15+0)/3 - 错误!

现在这将忽略空值,AVG 数学将是正确的,但C不会显示。

SELECT AVG(valFIeld) FROM myTable WHERE valField <> ''

我怎样才能满足这两个要求?

标签: mysqlsqlaverageaggregate-functionssql-null

解决方案


从您的评论中我了解到,您已valField定义为 varchar,因此您可以使用下一个技巧:

select 
    Code, 
    coalesce(avg(nullif(valField, '')), 0) as avg_value
from tbl 
group by Code;

在SQLize.online上测试查询

在这里,我使用NULLIF函数在计算平均值之前将空值转换为 null


推荐阅读