Mysql 忽略平均数学中的空值,但在结果中显示为零
我需要计算字段的Mysql 忽略平均数学中的空值,但在结果中显示为零,mysql,sql,average,aggregate-functions,sql-null,Mysql,Sql,Average,Aggregate Functions,Sql Null,我需要计算字段的平均值,但需要做两件事: 1-空值不应计入平均值。 2-如果字段为空,则仍必须在结果中显示(平均值==0) 假设我有这个数据集: ----------------------- Code | valField | Date ----------------------- A | | 2020-09-08 B | 12 | 2020-09-09 A | 10 | 2020-09-08 B | 15 | 2
平均值,但需要做两件事:
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
所以我需要一天的平均值。如您所见,我们有:
A={empty,10}
B={12,15,空}
C={empty}
我需要这样计算平均值:
平均A=10
B=(12+15)/2的平均值(因为我们有两个非空值)
C=0的平均值(它没有一个值,但我需要它在结果中显示为0)
到目前为止,我可以完成这两个要求,但不能同时完成
此查询将显示空值,但也将对average math
SELECT AVG(valField) FROM myTable;
所以B的平均值是=(12+15+0)/3-错了
现在,这将忽略空值,平均值将是正确的,但不会显示C
SELECT AVG(valFIeld) FROM myTable WHERE valField <> ''
从valFIeld“”所在的myTable中选择平均值(valFIeld)
我怎样才能同时满足这两个要求?我想您需要:
SELECT code, COALESCE(AVG(valField), 0) FROM myTable GROUP BY code
这假设valField
是数字数据类型,空表示null
以下是发动机罩后面发生的情况:
avg()
与大多数其他聚合函数一样,忽略null
值
- 如果所有值均为
null
,则avg()
将返回null
;使用coalesce()
根据我理解的您的评论,您已经将valField
定义为varchar,因此您可以使用下一个技巧:
select
Code,
coalesce(avg(nullif(valField, '')), 0) as avg_value
from tbl
group by Code;
在上测试查询
在这里,我使用函数将空值转换为null,然后再计算平均值。这应该很容易。只需创建两个查询,一个使用非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;
valField的数据类型是什么?请提供您的桌子结构。嗨@SlavaRozhnevvalField
可以是整数
或空
(非空)。您好!其实我的意思是空的。数据库不是空的,但有些值只是空的`'。它仍然在计算AVG()上的空行。如果有10行,但其中只有5行有值,则平均值应仅除以5,而不是全部10。另一方面,如果代码只有空值,那么它应该返回0。还有,忘了提一下,我是按
date`以
YYYY-MM-DD的格式分组的。您好。谢谢你的回复。这可能是对的,因为它会返回每个代码的平均值(每个代码中的一个),但我需要每天的平均值,所以我会在数据库中找到所有代码及其每天的平均值。因此,只需将Date
添加到groupby
中,然后选择查询部分