MySQL查询:如何计算一行中的平均值?

时间:2009-04-02 18:57:16

标签: mysql

AVG()函数计算列均值,但如何在同一行中检索多个值的平均值,如下所示:

SELECT MEAN(A.a, A.b, ... , A.n) FROM A;
编辑:当然,正如切鲁维姆建议我能做的那样:

SELECT MEAN(A.a + A.b + ... + A.n) / n FROM A;

但是我试图找出是否有更精简的方法。

5 个答案:

答案 0 :(得分:7)

select (A.a + A.b) / 2 from A;

答案 1 :(得分:1)

我偶然发现了类似的情况。这很有用:http://tech-blog.borychowski.com/index.php/2009/02/mysql/average-value-in-a-row/

从页面:

当我们这样做时:

SELECT *, (V.rank_0 + V.rank_1 + V.rank_2) / 3
AS row_avg FROM voting V

我们只接收所有值都不为NULL的行的正确平均值。但当我有例如3,NULL,4我想得到3.5作为回报。那是函数COALESCE()派上用场的那一刻。

COALESCE()做什么?从MySQL手册我们有:

返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL。

mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL

这些信息将帮助我们构建另一个SELECT语句:

SELECT *,

#first part
(COALESCE(V.rank_0, 0)
+ COALESCE(V.rank_1, 0)
+ COALESCE(V.rank_2, 0))
/

#second part
(3 -
(COALESCE(V.rank_0 - V.rank_0, 1)
+ COALESCE(V.rank_1 - V.rank_1, 1)
+ COALESCE(V.rank_2 - V.rank_2, 1))
) AS row_avg FROM voting V

答案 2 :(得分:0)

如果没有其他人找到更好的解决方案,您可以随时将它们添加到一起,然后除以您添加的列数。

答案 3 :(得分:0)

不漂亮,但确实有效。

不是专门的MySql,但这个想法应该很容易翻译过来。

CREATE TABLE A (id int identity(1,1), C1 int, C2 int, C3 int)
GO

INSERT INTO A VALUES (1,1,1)
INSERT INTO A VALUES (2,2,2)
INSERT INTO A VALUES (3,3,3)
INSERT INTO A VALUES (1,2,3)
INSERT INTO A VALUES (4,5,6)
GO

CREATE VIEW A_Values
AS
SELECT ID, AVG(Val) AS Average 
FROM
(
    SELECT ID, C1 AS Val FROM A
    UNION ALL
    SELECT ID, C2 AS Val FROM A
    UNION ALL
    SELECT ID, C3 AS Val FROM A
) Q
GROUP BY ID
GO


SELECT * FROM A_Values
GO

答案 4 :(得分:0)

我不熟悉MySQL语法,但是如何将行数据作为多行使用单列转储到临时表中,然后使用AVG()函数获取结果呢?