2

我需要计算从 0 到 5 的几列的平均值。但是我想从 AVG 计算中排除零。

所以我有类似的东西

SELECT AVG(column1), AVG(column2), AVG(column3) FROM table1
WHERE ???
4

4 回答 4

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,那么您应该 ROUND() 或 TRUNCATE() 您在 NULLIF() 中的值。前任:

 AVG( NULLIF( ROUND(column1,3), 0.000 )) AS column1

-- 杰杰 --

于 2013-10-08T22:08:38.303 回答
1

您可以执行以下操作,将列相加并除以值不等于零的行数:

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

不是你还必须在分母中除以零(我上面没有做过)......

于 2013-10-08T21:52:32.463 回答
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;
于 2013-10-08T21:49:45.467 回答
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
于 2013-10-08T22:09:29.197 回答