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`