代码之家  ›  专栏  ›  技术社区  ›  markus

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

  •  8
  • markus  · 技术社区  · 15 年前

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

    SELECT MEAN(A.a, A.b, ... , A.n) FROM A;
    

    编辑:当然,正如切鲁维姆所说,我可以做到:

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

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

    5 回复  |  直到 11 年前
        1
  •  7
  •   cherouvim    15 年前
    select (A.a + A.b) / 2 from A;
    
        2
  •  1
  •   Pratyush    11 年前

    我偶然发现了类似的情况。这很有用: 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
    

    我们只接收所有值不为空的行的正确平均值。但当我有3个,空,4个,我想得到3.5作为回报。现在函数coalesce()就可以派上用场了。

    Coalesce()的作用是什么?在MySQL手册中,我们有:

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

    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
    
        3
  •  0
  •   AaronLS    15 年前

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

        4
  •  0
  •   beach    15 年前

    不是很漂亮,但很管用。

    不是特别的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
    
        5
  •  0
  •   patjbs    15 年前

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