忽略平均数学上的空值,但在结果上显示为零

Ignore empty values on average math, but show it as zero on result

我需要计算字段的 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 = { 空,10 }
B = { 12, 15, 空}
C = {空}

我需要这样计算平均值:
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 <> ''

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

我想你想要:

SELECT code, COALESCE(AVG(valField), 0) FROM myTable GROUP BY code

这假设 valField 是数字数据类型,并且 empty 你的意思是 null.

这是幕后发生的事情:

  • avg(),与大多数其他聚合函数一样,忽略 null

  • 如果所有值都是null,那么avg()就是returnnull;您可以使用 coalesce()

    将其替换为 0

根据你的评论我了解到,你将 valField 定义为 varchar,因此你可以使用下一个技巧:

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

SQLize.online

上测试查询

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

这应该很容易,只需创建两个查询,一个使用非空值计算平均值,另一个计算数据中没有值的代码。

select round(avg(valField)) as avg, code from new where valField is not null group by Code
union all
select 0 as avg, code from new  group by Code having avg(valField) is null;