【问题标题】:MySQL issue in getting average of a columnMySQL 获取列平均值的问题
【发布时间】:2013-01-01 04:16:57
【问题描述】:

我有一个 MySQL 表,其中包含三列 id、name 和 height。

我想运行一个查询来返回所有条目的名称和高度,以及所有条目的平均高度。所有这些事情都必须在一个查询中完成。

这是我尝试过的。

SELECT name, height, avg(height) as average_height FROM mytable

这个查询只返回一行,但平均高度是正确的。

name    height    average_height
--------------------------------
Harry   165       169.5

然后我尝试了这个查询

SELECT name, height, avg(height) as average_height FROM mytable GROUP BY name

然后它返回所有行,但平均值不正确

name    height    average_height
--------------------------------
Harry   165       165
Tom     170       170
George  180       180
Raj     163       163

如何在单个查询中获取平均值以及所有行。

【问题讨论】:

  • 这些是两个不同的函数(一个聚合和一个列表),您最多可以合并两个单独的查询并将平均值作为第一行/最后一行,但是因为您正在查找所有信息无论如何,为什么不只计算 MySQL 之外的平均值?
  • @Rudu,正如几个答案所示,使用连接或子查询产生所需的结果并不难。从技术角度来看,这没有问题。虽然尚不清楚为什么 OP 想要这样做,但在很多情况下,这样的操作是有意义的。例如,如果您想要一列列出一个人相对于平均值的身高,则需要将平均身高连接到每一行。

标签: mysql database select average


【解决方案1】:

这是一种方法:

SELECT name, height, average_height FROM mytable CROSS JOIN (
   select avg(height) as average_height FROM mytable
) as avg;

SQLFiddle example(更新示例以反映使用 CROSS JOIN 的建议)。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT name, height, average_height 
    FROM mytable, (SELECT AVG(height) average_height FROM mytable) A 
    

    SELECT name, height, (SELECT AVG(height) FROM mytable) AS average_height 
    FROM mytable
    

    【讨论】:

      【解决方案3】:

      在第一次查询中,您询问的是平均高度,它会根据第一条记录 (Harry) 打印平均高度。在第二个查询中,您要询问按姓名分组的组中所有学生的平均身高。现在,在您的情况下,您有四个组,每个组仅包含一条记录,因为没有重复名称,因此一条记录的平均高度将作为该记录本身的高度。

      您要做的是打印每条记录,然后打印平均高度。

      SELECT name, height, (SELECT AVG(height) FROM mytable) AS average_height 
      FROM mytable;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 2021-08-07
        • 1970-01-01
        • 2015-02-19
        • 2015-09-11
        • 2020-05-08
        • 1970-01-01
        相关资源
        最近更新 更多