【问题标题】:Ignore empty values on average math, but show it as zero on result忽略平均数学中的空值,但在结果中显示为零
【发布时间】:2020-11-16 15:07:59
【问题描述】:

我需要计算字段的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 <> ''

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

【问题讨论】:

  • valField 有哪些数据类型?请提供您的表结构。
  • 嗨! @SlavaRozhnev valField 可以是 integerempty(非空)。

标签: mysql sql average aggregate-functions sql-null


【解决方案1】:

根据我的理解,您已将 valField 定义为 varchar,因此您可以使用下一个技巧:

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

SQLize.online上测试查询

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

【讨论】:

  • 你好。感谢您的回复。这可能是对的,因为它返回了每个代码的平均值(每个代码之一),但我需要每天的平均值,所以我将在数据库中拥有所有代码及其每天的平均值。
  • 所以,只需将Date 添加到group by 并选择查询部分
【解决方案2】:

我想你想要:

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

这假设 valField 是数字数据类型,并且 empty 是指 null

这是幕后发生的事情:

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

  • 如果所有值都是null,那么avg() 会返回null;您可以使用coalesce() 将其替换为0

【讨论】:

  • 您好!其实我的意思确实是空的。数据库不为空,但有些值为空 ` '' . It still counting empty rows on AVG(). If there are 10 rows, but only 5 of them have values, the average should divide the sum only by 5 not all 10s. On the other hand, if a code has ONLY empty values, so it should return 0. Also, forgot to mention, I'm grouping by date`,格式为YYYY-MM-DD
【解决方案3】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多