计算三列的平均数

时间:2014-11-21 14:11:24

标签: mysql sql

我正在尝试计算三列中的平均数,但如果列不为空并且大于0,则只包括计算中的列;

例如平均值通常是

(column1 + column2 + column3) / 3

但如果column3为null或0,那么它将是

(column1 + column2 + column3) / 2 or (column1 + column2 ) / 2

我有这个解决方案,但它不完整。当其中一列为0(默认为0)

时,平均值是错误的
SELECT movie.title,
 movie.imdbrating,
 movie.metacritic,
 tomato.rating,
 ((imdbrating + metacritic + tomato.rating)/3) as average
FROM movie, tomato
WHERE movie.imdbid = tomato.imdbid 

我该如何实现?

3 个答案:

答案 0 :(得分:2)

我正在修复查询的其余部分以使用表别名和正确的join语法。但是case语句是你真正需要的:

SELECT m.title, m.imdbrating, m.metacritic,
       t.rating,
       ((case when imdbrating > 0 then imdbrating else 0 end) +
        (case when metacritic > 0 then metacritic else 0 end) +
        (case when t.rating > 0 then t.rating else 0 end) +
       ) / nullif(coalesce((imdbrating > 0), 0) + coalesce((metacritic > 0), 0) + coalesce((t.rating > 0), 0)), 0)
FROM movie m JOIN
     tomato t
     ON m.imdbid = t.imdbid;

分母使用方便的MySQL扩展,其中布尔值在数值上下文中被视为0或1。如果没有符合条件的评级,则nullif()会返回NULL。并且> 0NULL值不适用。

答案 1 :(得分:-1)

试试这个:

SELECT (IF Column3 IS NULL OR Column3=0, AVG(Column1+Column2), Avg(Column1+Column2+ Column3)) as Result FROM Table

修改

如果任何树列可以为null,请尝试:

SELECT AVG(IF(Column1 IS NULL,0,Column1)+IF(Column2 IS NULL,0,Column2)+IF(Column3 IS NULL,0,Column3)) as Result FROM Table

答案 2 :(得分:-1)

<强>更新

(ifnull(column1,0)+ifnull(column2,0)+ifnull(column3,0))/
nullif((abs(sign(ifnull(column1,0)))
       +abs(sign(ifnull(column2,0)))
       +abs(sign(ifnull(column3,0)))), 0)

可以处理负值。

Demo to test