MySQL:如何仅获取正值的平均值?

3
假设我有一个 INT 列,并且我使用 -1 表示在 INSERT 时没有可用数据。我想获取该列所有大于等于 0 的值的平均值。
这是否可能?
谢谢。
我忘了提到我正在与其他 AVG 一起使用,所以它是 select avg(a), avg(b), avg(d) from tab; ... 所以我不能使用 b>0... 因为其他列需要使用行数据,而不管此列的数据是否为 -1。
但我想到了一种方法可以增加 AVG 结果,例如如果它通常是 (4 + 5 + -1 + -1 + 6) / 5。但是,如果我知道有多少个 -1,我可以“修复”结果以排除它们。

理想情况下是正确的,但数据已经在数据库中了。 - Nerfino
你的数据库是铁板一块吗? - Karoly Horvath
@Nerfino:如果有人回答了你的问题,请接受回答吧 :) - Abhay
4个回答

5
这可能会有所帮助:
如果你想从平均值中忽略-1的值:
SELECT AVG(`a`), AVG(IF(`b` > -1, `b`, NULL)), AVG(`c`) FROM `t`;

如果您想在平均值中考虑-1的值:

SELECT AVG(`a`), AVG(IF(`b` > -1, `b`, 0)), AVG(`c`) FROM `t`;

我假设了虚拟列名和表名,并假设列b是您想要仅考虑值 >= 0的列。请根据您的架构自由命名。


4
SELECT AVG(`field`) FROM `table` WHERE `field` >= 0

应该是 >= 0 或者 > -1 - Michas
1
我忘了提到我正在与其他平均值一起进行这个操作,所以查询语句是 select avg(a), avg(b), avg(d) from tab; ... 所以我不能使用 field>0。 - Nerfino
我不知道MySQL中有一个AVG()函数,MSSQL中是否有类似的函数? - brenjt

2
请使用以下内容:
SELECT    AVG(Column),   
 SUM(IF(Column>0))/COUNT(IF(Column>0))
 FROM Table

SELECT AVG(Column), (SELECT AVG(Column) WHERE Column >= 0) as AVG2 ;平均选择(Column),(选择平均(Column) WHERE Column >= 0)作为AVG2; - Ben

0

你能做这样的事吗?

SUM(column) / COUNT(*) as Average FROM 'table' WHERE 'column' >= 0

如果我能得到每行非负值的计数,我就可以轻松地解决这个问题。 - Nerfino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接