我需要计算几列的平均值,范围从0到5.但是我想从AVG计算中排除零。
所以我有类似
的东西SELECT AVG(column1), AVG(column2), AVG(column3) FROM table1
WHERE ???
答案 0 :(得分:4)
AVG()仅计算非空的记录 当值与第二个参数匹配时,NULLIF()将返回null。
SELECT AVG(NULLIF(column1,0)), AVG(NULLIF(column2,0)), AVG(NULLIF(column3,0)) FROM table
WHERE ????
您可以使用IF(column1 IN(x,y,z),column1,NULL)创建更复杂的AVG()。
注意:如果您的列的数据是REAL或FLOAT,那么您应该在NULLIF()中使用ROUND()或TRUNCATE()值。 EX:
AVG( NULLIF( ROUND(column1,3), 0.000 )) AS column1
- JJ -
答案 1 :(得分:1)
您可以执行以下操作:将colummn求和并除以值不等于零的行数:
SELECT SUM(Column1) / SUM (IF(Column1 = 0, 0, 1)),
SUM(Column2) / SUM (IF(Column2 = 0, 0, 1)),
SUM(Column3) / SUM (IF(Column3 = 0, 0, 1))
FROM table1
不是你也必须在分母(我上面没有做过)中将零除以... ...
答案 2 :(得分:0)
由于WHERE子句排除或包含整行,因此您需要三个不同的查询。您可以将它们组合成单个查询,这要归功于子查询:
SELECT (SELECT AVG(column1) FROM table WHERE column1 != 0) as avg1,
(SELECT AVG(column2) FROM table WHERE column2 != 0) as avg2,
(SELECT AVG(column3) FROM table WHERE column3 != 0) as avg3;
答案 3 :(得分:0)
您可以通过将您关注的值相加并除以您关注的值的数量来计算您自己的平均值,如下所示:
select
sum(case when column1 = 0 then 0 else column1 end) /
sum(case when column1 = 0 then 0 else 1 end) as avg1,
sum(case when column2 = 0 then 0 else column2 end) /
sum(case when column2 = 0 then 0 else 1 end) as avg2,
sum(case when column3 = 0 then 0 else column3 end) /
sum(case when column3 = 0 then 0 else 1 end) as avg3
FROM table1