mysql - 忽略平均数学中的空值,但在结果中显示为零
问题描述
我需要计算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 <> ''
我怎样才能满足这两个要求?
解决方案
从您的评论中我了解到,您已valField
定义为 varchar,因此您可以使用下一个技巧:
select
Code,
coalesce(avg(nullif(valField, '')), 0) as avg_value
from tbl
group by Code;
在SQLize.online上测试查询
在这里,我使用NULLIF函数在计算平均值之前将空值转换为 null
推荐阅读
- javascript - JavaScript 根据数据组合多个数组
- javascript - 如何让选中的复选框在警报时显示
- graph - 当被问及两张图是否相同时,问题是 P、NP、NP-hard、NP-complete 吗?
- android - Android Studio 缺少一些属性
- json - 如何从json获取数据中对两个或多个值求和
- python - 为什么 .join() 不是字符串的属性?
- http - 充当中间人时的状态码指南
- c# - WPF MVVM Datagrid 两种方式绑定
- prolog - 使用 as( 代码 ) 解码 udp_receive 接收的原始字节
- angular - 在 ng-template 中使用函数强制转换变量时是否会对性能产生重大影响?