我正在尝试计算三列中的平均数,但如果列不为空并且大于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
我该如何实现?
答案 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
。并且> 0
对NULL
值不适用。
答案 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)
可以处理负值。