Mysql 聚合查询删除零
我需要计算从0到5的两列的平均值。但是,我想从平均值计算中排除零 所以我有点像Mysql 聚合查询删除零,mysql,sql,average,Mysql,Sql,Average,我需要计算从0到5的两列的平均值。但是,我想从平均值计算中排除零 所以我有点像 SELECT AVG(column1), AVG(column2), AVG(column3) FROM table1 WHERE ??? 由于WHERE子句排除或包含整行,因此需要三种不同的查询。不过,由于子查询,您可以将它们组合到单个查询中: SELECT (SELECT AVG(column1) FROM table WHERE column1 != 0) as avg1, (SELECT A
SELECT AVG(column1), AVG(column2), AVG(column3) FROM table1
WHERE ???
由于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;
您可以这样做,将列mn相加,然后除以值不等于零的行数:
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
不,您还必须在分母中使用陷阱除以零(我在上面没有这样做).AVG()只计算非空的记录。当值与第二个参数匹配时,NULLIF()将返回null
SELECT AVG(NULLIF(column1,0)), AVG(NULLIF(column2,0)), AVG(NULLIF(column3,0)) FROM table
WHERE ????
您可以在中使用IF(x,y,z中的column1,column1,NULL)来创建更复杂的AVG()
注意:如果列的数据是实数或浮点数,则应在NULLIF()中舍入()或截断()值。例:
--JJ--您可以通过将您关心的值相加,然后除以您关心的值的计数来计算您自己的平均值,如下所示:
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
SUM(Column1)/SUM(如果(Column1=0,0,1))不是平均值,avg=SUM/count@LuciaPasarin
SUM(如果(Colum1=0,0,1))
是一种计算非零行的技术当然,我没有看到0,0,1部分。我这边的评论太快了,对不起!实际上,这个方法有一个缺陷:如果列有NULL,它将无法正确计算结果:10,0,NULL
应该产生10
,但是。哇,非常好。作为奖励,你不必担心被零除。您可能希望包括我认为0将被精确存储,无论是作为实型
还是作为浮点型
(因此不需要四舍五入)。而NULLIF解真的很好,+1。
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