如果任何值为null,Mysql make AVG将返回null

如果任何值为null,Mysql make AVG将返回null,mysql,average,Mysql,Average,我试图从MySQL中的一个专栏中获取平均值。但是,如果某些值为空,则必须以另一种方式进行计算。所以,我试图做到: 如果sales表中的任何行的amount为NULL,我希望选择AVGamount from sales返回NULL。可以这样做吗?您可以使用以下查询: SELECT CASE WHEN (SELECT COUNT(*) FROM Sales WHERE amount = 0 OR amount IS NULL)

我试图从MySQL中的一个专栏中获取平均值。但是,如果某些值为空,则必须以另一种方式进行计算。所以,我试图做到:


如果sales表中的任何行的amount为NULL,我希望选择AVGamount from sales返回NULL。可以这样做吗?

您可以使用以下查询:

SELECT CASE WHEN (SELECT COUNT(*)
                  FROM Sales
                  WHERE amount = 0 OR amount IS NULL) <> 0 
                  THEN NULL 
            ELSE AVG(amount)  END
FROM Sales 
上面在CASE表达式中使用子查询来检查0或NULL值。如果金额字段的任何一个值为0或NULL,则整个平均值返回为NULL,否则返回金额的平均值


我会尝试将空值计算为零:

SELECT AVG(IFNULL(amount,0)) from sales
编辑错误地解释了之前的问题:

SELECT IF(sum(amount is NULL), NULL, AVG(amount)) from sales

我相信有几种方法可以做到这一点。。。这是一种方式

我使用交叉连接为所有记录返回相同的值,如果该值大于1,则存在null记录,我使用case语句对avg求反,而不是返回null。这可以很容易地在函数调用中完成

SELECT case when B.c>1 then null else avg(amount) end as myAvg 
FROM Sales 
CROSS JOIN (
  SELECT count(*) c FROM Sales 
  WHERE amount is null) B
GROUP BY  B.C

您可以在mysqlselect中执行条件。您可以使用PHP执行此操作吗?尝试使用select AVGIFNULLamount,0 from sales。您的意思是amount 0还是amount NULL?零和空不一样…所以在计算平均值时,您希望在分母中包含空值?记录AVG1,2,3,4,NULL将产生NULL,但您希望的方式是21+2+3+4+0=10/5,还是希望1+2+3+4/4=10/4或2.5?我在这种方法中认为。问题是,我的查询没有那么简单。我有连接和一些地方。使用这种方法,我必须在子查询中复制查询,这是不可取的。这将空值计算为ceros,如果任何值为空,我希望AVG的结果为空。@JavierEnríquez,抱歉,错了,更新了答案。