Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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 - Fatal编程技术网

MySQL中的行平均数-如何从计数中排除空行

MySQL中的行平均数-如何从计数中排除空行,mysql,sql,Mysql,Sql,我有一个简单的表(test),我需要在其中执行一些平均值(我想要得到一个行平均值和一个“总计”列平均值) 我注意到MySQL AVG()函数从计数中排除空值(它们不被计为0),这正是我想要的 以类似的方式,我希望得到以下结果: var1 var2 var3 total 8.5 NULL 4.5 6.5 (i.e. the overall average is 6.5 *not* 4.3333) 但我的查询如下所示: SELECT AVG(var1) AS var1, AVG(var

我有一个简单的表(test),我需要在其中执行一些平均值(我想要得到一个行平均值和一个“总计”列平均值)

我注意到MySQL AVG()函数从计数中排除空值(它们不被计为0),这正是我想要的

以类似的方式,我希望得到以下结果:

var1 var2  var3 total
8.5  NULL  4.5  6.5   (i.e. the overall average is 6.5 *not* 4.3333)
但我的查询如下所示:

SELECT
AVG(var1) AS var1,
AVG(var2) AS var2,
AVG(var3) AS var3,
(
 AVG(var1)+ 
 AVG(var2)+
 AVG(var3)
)/3.0 AS metric_total
FROM test
返回的总平均值为4.333

是否可以在单个查询中获得一个行平均值,该平均值以与AVG()函数相同的方式从计数中排除空条目

SELECT
    avg1, avg2, avg3,
    ( 
      (COALESCE(avg1, 0) + COALESCE(avg2, 0) + COALESCE(avg3, 0)) -- only add non-null values
      / -- division
      ( IF(avg1 IS NULL, 0, 1) + IF(avg2 IS NULL, 0, 1) + IF(avg3 IS NULL, 0, 1) ) -- number of non-null averages
    ) AS metric_total
FROM
    ( SELECT
        (SELECT AVG(var1) FROM test) AS avg1,
        (SELECT AVG(var2) FROM test) AS avg2,
        (SELECT AVG(var3) FROM test) AS avg3
    ) AS sub
子查询只允许不重复
AVG()
函数


尝试使用
AVG(ISNULL(var1,0))、AVG(ISNULL(var2,0))
而不是
AVG(var1)、AVG(var2,0))
您需要所有列中var1、var2和var3的平均值。也许对每一列进行子选择以获得其平均值,每个子选择联合在一起。缺点是,只有当每列具有相同数量的非空字段时,这才有效

SELECT AVG(FirstAvg)
FROM
(
    SELECT AVG(var1) AS FirstAvg
    FROM test
    UNION
    SELECT AVG(var2) AS FirstAvg
    FROM test
    UNION
    SELECT AVG(var3) AS FirstAvg
    FROM test
) Sub1
要解决这个问题,可能只需在子菜单上执行一次平均值

SELECT AVG(FirstAvg)
FROM
(
    SELECT var1 AS FirstAvg
    FROM test
    UNION
    SELECT var2 AS FirstAvg
    FROM test
    UNION
    SELECT var3 AS FirstAvg
    FROM test
) Sub1
要获得其他列的平均值,请执行以下操作:-

SELECT AVG(var1), AVG(var2), AVG(var3), AVG(FirstAvg) AS total
FROM
(
    SELECT var1 AS var1, NULL AS var2, NULL AS var3, var1 AS FirstAvg
    FROM test
    UNION
    SELECT NULL AS var1, var2 AS var2, NULL AS var3, var2 AS FirstAvg
    FROM test
    UNION
    SELECT NULL AS var1, NULL AS var2, var3 AS var3, var3 AS FirstAvg
    FROM test
) Sub1

这个怎么样?好简单

SELECT
AVG(var1) AS var1,
AVG(var2) AS var2,
AVG(var3) AS var3,
(
 SUM(ifnull(var1,0))+
 SUM(ifnull(var2,0))+
 SUM(ifnull(var3,0))
) / (COUNT(var1)+COUNT(var2)+COUNT(var3))
 AS metric_total
FROM test

但是你的总数是5.2而不是6.5?最后一个给了我你指定的结果(即8.5000空4.5000 6.5000)我的错误。谢谢你的帮助回答。我不想将NULL强制转换为0。我想在平均值计算中从计数中排除空元素。关于不重复平均值这一点很好。但我的问题是如何返回6.5的总数,而您的总数仍然是4.333。@这一个应该可以。超级黑客,非常高效。我喜欢@mmacdonal请注意,使用此方法,
metric_total
是表中所有值的总体平均值。这不是平均数的平均数。示例:@vikingsteve感谢您指出这一点。如果结果总是相等的,则看起来很好。你能想到任何可能出错的情况吗?@mmacdonal这取决于你决定这个结果是否适合你的目的(请参考我前面评论中的链接,以获取示例)。与这里提出的所有其他解决方案相比,这种方法的速度非常快。它只是产生一个稍微不同的输出(当且仅当至少有一列同时包含
NULL
和非
NULL
值)。@vikingsteve Yes,如果任何行中都有NULL和非NULL值,则结果不同:。这可能会发生在我身上。尽管如此,我们还是很感激你的回答。
SELECT
AVG(var1) AS var1,
AVG(var2) AS var2,
AVG(var3) AS var3,
(
 SUM(ifnull(var1,0))+
 SUM(ifnull(var2,0))+
 SUM(ifnull(var3,0))
) / (COUNT(var1)+COUNT(var2)+COUNT(var3))
 AS metric_total
FROM test