我有一个简单的表格(测试),我需要执行一些平均值(我想得到一个行平均值和一个‘总’列平均值)。
 id  var1  var2  var3
 1   7     NULL  3
 2   10    NULL  6我注意到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()函数那样,在单个查询中获得从计数中排除NULL条目的行平均值?
发布于 2013-07-04 20:51:15
您需要所有列中所有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要解决这个问题,也许只需在子选择上执行一次AVG
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
) Sub1https://stackoverflow.com/questions/17470712
复制相似问题