我正在尝试从MySQL的一个列中获取AVG
。但是,如果某些值为null
,则必须以另一种方式进行计算。所以,我试图做到这一点:
SELECT AVG(amount) from sales
NULL
,则 amount
会向我NULL
返回。可以这样做吗?
答案 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
表达式中的子查询来检查0
或NULL
值。如果任何 amount
字段的一个值为0
或NULL
,则整个平均值将返回为NULL
,否则为{{{}的平均值1}}被返回。
答案 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