【发布时间】:2013-10-08 21:47:06
【问题描述】:
我需要计算几列的平均值,范围从 0 到 5。但是我想从 AVG 计算中排除零。
所以我有类似的东西
SELECT AVG(column1), AVG(column2), AVG(column3) FROM table1
WHERE ???
【问题讨论】:
我需要计算几列的平均值,范围从 0 到 5。但是我想从 AVG 计算中排除零。
所以我有类似的东西
SELECT AVG(column1), AVG(column2), AVG(column3) FROM table1
WHERE ???
【问题讨论】:
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
-- JJ--
【讨论】:
real 还是作为 float (因此不需要四舍五入)。而且 NULLIF 解决方案真的很好,+1。
您可以执行以下操作,将列相加并除以值不等于 0 的行数:
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
不是你还必须在分母中除以零(我在上面没有做过)......
【讨论】:
SUM(IF(Colum1=0,0,1)) 是一种计算非零行数的技术DEMO
10, 0, NULL应该产生10,但是your suggestion will yield 5。
由于 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;
【讨论】:
您可以通过将您关心的值相加并除以您关心的值的计数来计算自己的平均值,如下所示:
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
【讨论】: