我不确定这是否可能是我想要实现的目标。我想得到平均列的平均值。
SELECT avg(col1), avg(col2), avg(col3) FROM tbl
我的结果应该是所有三个平均列的平均值,这可能吗?像这样的东西
SELECT avg( col1, col2, col3) FROM tbl
在MySQL 5.1中不起作用
答案 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
假设:
潜在问题:
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
这会丢弃空值