Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 聚合查询删除零_Mysql_Sql_Average - Fatal编程技术网

Mysql 聚合查询删除零

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

我需要计算从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 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