【问题标题】:get AVG() after GROUP BY in MYSQL在 MYSQL 中的 GROUP BY 之后获取 AVG()
【发布时间】:2017-08-22 07:19:32
【问题描述】:

刚开始学习MYSQL,遇到这样的问题

所以表格是这样的:

id  name  moneySpent 
1   Alex    3
2   Alex    1
3   Bill    4
4   Alex    2
5   Alex    1
6   Chris   5
7   Chris   3

假设我想知道人均花费的平均金额。我尝试通过使用 SUM() GROUP BY 和 AVG() 来做到这一点,但我被困在 AVG()

SELECT name, sum(moneySpent) AS total FROM table GROUP BY name;

然后这将返回

name  total
Alex  7
Bill  4
Chris 8

那么我怎样才能使用 AVG() 得到 (7+4+8)/3 呢?

【问题讨论】:

  • ... union all select 'average', SUM(moneySpent) / count(distinct name) from table

标签: mysql sql


【解决方案1】:

您可以使用以下方法获得平均每人:

SELECT AVG(total) AS AVERAGE 
FROM (SELECT name, sum(moneySpent) AS total 
      FROM table GROUP BY name) A
    ;

输出:

AVERAGE
6,3333

【讨论】:

  • 所以这就像我使用一个表来存储第一个 SELECT 结果并在这个新表上执行 AVG() ?感谢您的回答,但我想知道我是否可以这样做避免额外的空间?如果我弄错了请不要怪我,请我开始学习SQL。
【解决方案2】:

您可以使用内部查询获取sum,使用外部查询从 sum 中导出average,如下所示。

SELECT  Avg(sum1) FROM  (
SELECT  Sum(amount) AS sum1
FROM table1
GROUP BY NAME
) T1

它将生成以下输出。

AVERAGE_AMOUNT_SPENT
------------------
6.3333

这是你想要的输出,即(7+4+8)/3 = 6.333

您可以查看演示here

【讨论】:

    【解决方案3】:

    所以有两种方法可以做到这一点,第一种是使用新表来存储 SELECT 结果。它要简单得多,但可能会占用更多空间。 第二个是 jarlh,我觉得我不需要 GROUP BY 整张桌子,我可以把所有的钱加起来,然后除以不同的名字。 谢谢大家!

    【讨论】:

      【解决方案4】:
      select avg(total) as average from (SELECT name, sum(moneySpent) AS total FROM table GROUP BY name);
      

      您可以使用此查询来获得所需的输出

      OUTPUT: AVERAGE 6.3333333333333333

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-14
        • 2016-04-03
        • 2012-09-18
        • 1970-01-01
        相关资源
        最近更新 更多