Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_Database - Fatal编程技术网

Mysql 计算某些列的平均值,不计算空值

Mysql 计算某些列的平均值,不计算空值,mysql,sql,database,Mysql,Sql,Database,我有一张表,上面有一些读数,如下所示: id foo bar baz qux 1 2 4 NULL 3 2 6 11 0 2 我想计算一些列的平均值,不包括计数中的空值。类似于以下伪代码: select (foo+bar+baz)/countNonNulls(foo,bar,baz) AS result FROM readings WHERE id=1; 也就是说,我的预期结果是(2+4)/2=3 有

我有一张表,上面有一些读数,如下所示:

id  foo   bar   baz   qux
1   2     4     NULL  3            
2   6     11    0     2
我想计算一些列的平均值,不包括计数中的空值。类似于以下伪代码:

select (foo+bar+baz)/countNonNulls(foo,bar,baz) AS result 
  FROM readings WHERE id=1;
也就是说,我的预期结果是(2+4)/2=3


有没有一种方法可以在单个SQL查询中实现这一点?

尝试where子句:在MySQL中,where[nameColumn]不为null

可以使用:

select (coalesce(foo, 0) + coalesce(bar, 0) + coalesce(baz, 0) /
        ((foo is not null) + (bar is not null) + (baz is not null))
       ) as average
请注意,这假设至少有一个值不为null,以防止被0除

要处理一般情况,您可以使用以下用例:

select (case when coalesce(foo, bar, bz) is not null
             then (coalesce(foo, 0) + coalesce(bar, 0) + coalesce(baz, 0) /
                   ((foo is not null) + (bar is not null) + (baz is not null))
                  )
        end) as average

这种问题有时表明设计不佳。为什么要在原始值周围添加聚结?@MMacdonald。如果将
NULL
值添加到另一个数字,则将得到
NULL
NULL
不被视为零(尽管在聚合函数中,如
sum()
NUL
值被忽略,因此与0的处理方式相同)。