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

MySQL查询:如何计算一行中值的平均值?,mysql,Mysql,AVG()函数计算列平均值,但如何检索同一行中多个值的平均值,如下所示: SELECT MEAN(A.a, A.b, ... , A.n) FROM A; 编辑:当然,正如切鲁维姆建议的那样,我可以做到: SELECT MEAN(A.a + A.b + ... + A.n) / n FROM A; 但是我想知道是否有更精简的方法。如果没有其他人找到更好的解决方案,你可以把它们加在一起,然后除以你添加的列数。不漂亮,但它很有效 select (A.a + A.b) / 2 from A; 不

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

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

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

但是我想知道是否有更精简的方法。

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

不漂亮,但它很有效

select (A.a + A.b) / 2 from A;
不特别是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

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

我偶然发现了类似的情况。这很有用:

从页面:

当我们这样做时:

SELECT *, (V.rank_0 + V.rank_1 + V.rank_2) / 3
AS row_avg FROM voting V
对于所有值都不为空的行,我们只接收正确的平均值。但当我有,例如,3,空,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

嗯,我需要更通用的,意思是x变量。你肯定总是知道给定表的数字或列吗?@tharkun:这是否意味着你将选择x列,而你不知道x?你想完成什么?当然我可以计算我选择了多少列,并使用这些列来划分。。。关于我的问题,我只是想弄清楚,如果有一个函数,我怀疑会有一个函数。事实上,这并不难实现。更难的部分是想出一个可以使用它的场景:)有趣但不是mysql,也不是更精简;)Rich B:我有我自己的提问方式,你不需要系统地改变我的标题!如果您所描述的排列中有列,则表示此表未正确规范化。他们应该是孩子桌子上的一排。@Bill:也许有气味,但我不认为这里是这样。我有一个数据行中的单个问卷项目结果,对应一个用户和一个测量。好的,足够公平。气味并不是问题的100%指标。@BillKarwin几年后:它是一种气味!;)