Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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平均值与其他0的结果错误_Mysql_Sql - Fatal编程技术网

MySQL平均值与其他0的结果错误

MySQL平均值与其他0的结果错误,mysql,sql,Mysql,Sql,我根据另外两列的值对一列进行平均 表结构是这样的 | rid | rate | status |.... | 1 | 1500 | 1 |.... | 1 | 1500 | 1 |.... | 1 | 1500 | 1 |.... | 1 | 1500 | 1 |.... | 2 | 1500 | 1 |.... 当我这样做时,它会给我正确的结果1500,但对于无CASE匹配,它返回NULL,如果没有行匹配CASE条件,我需

我根据另外两列的值对一列进行平均

表结构是这样的

| rid | rate | status |....
|  1  | 1500 |   1    |....
|  1  | 1500 |   1    |....
|  1  | 1500 |   1    |....
|  1  | 1500 |   1    |....
|  2  | 1500 |   1    |....
当我这样做时,它会给我正确的结果
1500
,但对于无
CASE
匹配,它返回
NULL
,如果没有行匹配
CASE
条件,我需要
AVG
返回
0

AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1 AS `avg`
我试过这种方法,但结果不对,是
1200

AVG(CASE WHEN `rid` = `status` THEN `rate` ELSE 0 END) DIV 1 AS `avg`
为什么我会得到错误的结果

请查看并建议任何可能的方法


感谢

对您的结果应用
合并

COALESCE(AVG(CASE WHEN `rid` = `status` THEN `rate` END), 0) DIV 1 AS `avg`
尝试上面的查询


希望这能对您有所帮助。

您得到的是1200,因为case返回0的最后一行仍将作为一行计算,因此(1500*4+0)/5=1200

原因基于从表中筛选行时的情况
在第一个选项中,选择

  AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1 AS `avg`
仅对4行执行时的条件
请确认您没有将查询条件设置为仅针对匹配的
rid
=
状态进行筛选

第二

AVG(CASE WHEN `rid` = `status` THEN `rate` ELSE 0 END) DIV 1 AS `avg`
else子句还意味着使用最后一行(rid=2),因此您有5行,其中4行是avg的有效内容

IFNULL(AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1,0) AS `avg`

注意:MySQL IFNULL接受两个参数,如果第一个参数不为null,则返回第一个参数,否则返回第二个参数

请添加错误答案的记录,这与我的答案相同,仅使用专有的
IFNULL
而不是标准的
COALESCE
,甚至应用错误。请查看您放置
,0)
的位置。它应该在
AVG
的右括号之后,或者在
DIV 1
之后,而不是在别名之后。请投票否决的人解释原因?OP有一个工作公式(即公式中仅处理rid=状态记录,导致样本数据的正确值为1500)。只有当没有rid=status记录时,它们自然会得到NULL而不是零
COALESCE
将空值转换为零,从而解决了问题。这是做这件事的标准方法,适用于几乎所有的DBMS。先生,你的答案是更搁浅的方法,但我将使用
IFNULL
作为更快的方法。@High Boy:我不介意你更喜欢
IFNULL
,但我怀疑在速度上是否存在可测量的差异。我猜只能是几纳秒。
IFNULL(AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1,0) AS `avg`