Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 忽略平均数学中的空值,但在结果中显示为零_Mysql_Sql_Average_Aggregate Functions_Sql Null - Fatal编程技术网

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的数据类型是什么?请提供您的桌子结构。嗨@SlavaRozhnev
valField
可以是
整数
(非空)。您好!其实我的意思是空的。数据库不是空的,但有些值只是空的`'
。它仍然在计算AVG()上的空行。如果有10行,但其中只有5行有值,则平均值应仅除以5,而不是全部10。另一方面,如果代码只有空值,那么它应该返回0。还有,忘了提一下,我是按
date`以
YYYY-MM-DD的格式分组的。您好。谢谢你的回复。这可能是对的,因为它会返回每个代码的平均值(每个代码中的一个),但我需要每天的平均值,所以我会在数据库中找到所有代码及其每天的平均值。因此,只需将
Date
添加到
groupby
中,然后选择查询部分