如果任何值为null,则Mysql使AVG返回null

时间:2015-08-17 18:34:19

标签: mysql average

我正在尝试从MySQL的一个列中获取AVG。但是,如果某些值为null,则必须以另一种方式进行计算。所以,我试图做到这一点:

如果销售表中的任何行都有SELECT AVG(amount) from sales NULL,则

amount会向我NULL返回。可以这样做吗?

4 个答案:

答案 0 :(得分:2)

我会尝试(它将空值计为零):

SELECT AVG(IFNULL(amount,0)) from sales

编辑(之前误解了这个问题):

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

答案 1 :(得分:0)

您可以使用以下查询:

SELECT CASE WHEN (SELECT COUNT(*)
                  FROM Sales
                  WHERE amount = 0 OR amount IS NULL) <> 0 
                  THEN NULL 
            ELSE AVG(amount)  END
FROM Sales 

以上内容使用CASE表达式中的子查询来检查0NULL值。如果任何 amount字段的一个值为0NULL,则整个平均值将返回为NULL,否则为{{{}的平均值1}}被返回。

Demo here

答案 2 :(得分:0)

有不同的方法可以解决这个问题,这取决于您正在寻找的行为。

  • 您可以将空值视为0,这是有道理的,因为没有销售会像0销售。

    SELECT AVG(IFNULL(amount,0)) from sales
    
  • 您可以跳过具有空值的单元格。

    SELECT AVG(amount) from sales where amount IS NOT NULL;
    
  • 但也许你真正的问题是金额不应该为空。因此,您应该使列数不可为空,并且可能将其默认值设为0;

答案 3 :(得分:0)

我确定有几种方法可以做到这一点......这是一种方式。

如果该值为&gt;,我使用交叉连接为所有记录返回相同的值。然后存在一个空记录,我使用了一个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