我根据另外两列的值对列进行平均。
表结构就像这样
| 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`
为什么我的结果出错了?
请参阅并建议任何可行的方法。
由于
答案 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`