我不确定我想要实现的是否可能。我想获取平均列的平均值。
SELECT avg(col1), avg(col2), avg(col3) FROM tbl
我的结果应该是三个平均列的平均值,这可能吗?类似这样。
SELECT avg( col1, col2, col3) FROM tbl
在MySQL 5.1版本中无法正常工作。
SELECT avg( col1 + col2 + col3)/3.0 FROM tbl
您必须检查该列中是否存在空值。
SELECT (AVG(col1) * COUNT(col1) +
AVG(col2) * COUNT(col2) +
AVG(col3) * COUNT(col3)) /
(COUNT(col1) + COUNT(col2) + COUNT(col3))
FROM tbl
我试图在Anthony和zendar的基础上改进
SELECT (SUM(col1)+SUM(col2)+SUM(col3))/(COUNT(col1)+COUNT(col2)+COUNT(col3))
FROM tbl
假设:
可能存在的问题:
编辑(感谢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
基本数学:
SELECT AVG(col1 + col2 + col3) / 3 FROM tbl
仅仅是为了好玩,这里提供一个略有不同的解决方案,将 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 次完整的表扫描以创建虚拟表。请检查执行计划。
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
这将丢弃空值