一行中的平均值

时间:2010-04-06 09:19:37

标签: sql mysql

我不确定这是否可能是我想要实现的目标。我想得到平均列的平均值。

SELECT avg(col1), avg(col2), avg(col3) FROM tbl

我的结果应该是所有三个平均列的平均值,这可能吗?像这样的东西

SELECT avg( col1, col2, col3) FROM tbl

在MySQL 5.1中不起作用

6 个答案:

答案 0 :(得分:5)

SELECT (AVG(col1) * COUNT(col1) +
        AVG(col2) * COUNT(col2) +
        AVG(col3) * COUNT(col3)) /
       (COUNT(col1) + COUNT(col2) + COUNT(col3))
FROM tbl

答案 1 :(得分:5)

你有没有尝试过:

SELECT avg( col1 + col2 + col3)/3.0 FROM tbl

您必须检查此列中是否没有空值。

答案 2 :(得分:3)

试图改善安东尼和泽纳尔

SELECT (SUM(col1)+SUM(col2)+SUM(col3))/(COUNT(col1)+COUNT(col2)+COUNT(col3))     
FROM tbl

假设:

  • 所有值都具有相同的重要性(重量)
  • 有空值
  • 你总是想要正确的结果

潜在问题:

  • 对于整数输入AVG不会在SUM处出现溢出,因此可能需要显式强制转换
编辑(感谢redcayuga): 如果所有行的任何列都为NULL,则上述查询返回NULL,因此应将COALESCE应用于SUM

SELECT (COALESCE(SUM(col1),0)+
        COALESCE(SUM(col2),0)+
        COALESCE(SUM(col3),0))/(COUNT(col1)+COUNT(col2)+COUNT(col3))     
FROM tbl

答案 3 :(得分:1)

基础数学:

SELECT AVG(col1 + col2 + col3) / 3 FROM tbl

答案 4 :(得分:0)

只是为了好玩,这里有一个不同的解决方案,将NULL处理留给avg()函数:

SELECT avg(colValue) from 
  ( SELECT col1 as colValue from tbl
    UNION ALL
    SELECT col2 as colValue from tbl
    UNION ALL
    SELECT col3 as colValue from tbl
  )

来自co1l,col2和col3的值放在一个虚拟列中,然后数据库计算平均值。

您不必担心NULL值 - 数据库和avg()函数会为您执行此操作。

注意:这可能比其他解决方案慢,因为它可能导致3次全表扫描以创建虚拟表。检查执行计划。

答案 5 :(得分:0)

SELECT (ISNULL(AVG(col1),0) + ISNULL(AVG(col2),0) + .....)
       /
       (CASE WHEN AVG(col1) IS NULL THEN 0 ELSE 1 END + CASE WHEN AVG(col2) IS NULL THEN 0 ELSE 1 END +......)
  FROM tbl

这会丢弃空值