MySQL AVG错误结果与ELSE 0

时间:2017-06-21 05:37:05

标签: mysql sql

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

表结构就像这样

| rid | rate | status |....
|  1  | 1500 |   1    |....
|  1  | 1500 |   1    |....
|  1  | 1500 |   1    |....
|  1  | 1500 |   1    |....
|  2  | 1500 |   1    |....

当我这样做时,它会给我正确的结果1500,但是对于没有NULL匹配,它会返回CASE,我需要AVG才能返回0如果没有符合CASE条件的行。

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`

为什么我的结果出错了?

请参阅并建议任何可行的方法。

由于

5 个答案:

答案 0 :(得分:3)

试试这个

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

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

答案 1 :(得分:1)

SELECT AVG(RATE) FROM TABLENAME GROUP BY rid,status

尝试以上查询。

希望这会对你有所帮助。

答案 2 :(得分:1)

你得到1200,因为案件将返回0的最后一行仍然算作一行,因此(1500 * 4 + 0)/ 5 = 1200

答案 3 :(得分:1)

原因是基于从表格中过滤行的情况 在第一个选择

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

仅执行4行时的情况 事实上你没有其他条件查询只是匹配rid = status

在第二个

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

else子句意味着也使用最后一行(rid = 2),因此你有5行,其中包含4个有效的avg内容

答案 4 :(得分:0)

在结果上应用COALESCE

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