【问题标题】:SQL : how to calculate an average from a querySQL:如何计算查询的平均值
【发布时间】:2016-11-18 14:21:12
【问题描述】:

在我的第一份全职工作中,我已经使用 SQL 大约一周了,我正在尝试从一个查询中计算一些统计数据,其中我已经组合了来自不同表的列。

具体来说,我正在尝试从已应用过滤器(或约束?我不清楚 SQL 术语)的组合表中计算平均值。

通过research on Google,我学会了如何计算平均值:

SELECT AVG(column_name) 
FROM table_name

我遇到的问题是,这似乎只适用于数据库中的现有表,而不适用于我创建的新查询。

我的代码的简化版本如下:

SELECT 
    Animal_Facts.Animal_Name, Animal_Facts.Prev_Reg_Amount, 
    Names.Given_Name, Animal_Class.Class_Description
FROM 
    Names
INNER JOIN
    Animal_Facts ON Names.Name_Key = Animal_Facts.Name_Key
INNER JOIN 
    Animal_Class ON Animal_Facts.Class_Key = Animal_Class.Class_Key

此查询创建了来自三个表的四列的组合,其中Class_Description 描述了动物是否已绝育、植入微芯片、是否为养老金领取者所有等,而 Pre_Reg_Amount 是支付的注册费。

我想找出养老金领取者支付的平均费用,因此我包含以下代码行来过滤表格:

AND Animal_Class.Class_Description LIKE ('%pensioner%')

然后计算我添加的平均值:

SELECT AVG(Animal_Facts.Prev_Reg_Amount) from Animal_Facts

所以我的总代码是:

SELECT 
    Animal_Facts.Animal_Name, Animal_Facts.Prev_Reg_Amount, 
    Names.Given_Name, Animal_Class.Class_Description
FROM 
    Names
INNER JOIN
    Animal_Facts ON Names.Name_Key = Animal_Facts.Name_Key
INNER JOIN
    Animal_Class ON Animal_Facts.Class_Key = Animal_Class.Class_Key
                 AND Animal_Class.Class_Description LIKE ('%pensioner%')

SELECT AVG(Animal_Facts.Prev_Reg_Amount) 
FROM Animal_Facts

现在的问题是,在 Excel 中检查了这个计算之后,我实际上得到的不是养老金领取者数据的平均值,而是所有数据的平均值。有没有办法直接从我在 SQL 中创建的表中计算平均值(和其他统计数据)?

注意:我可以通过将数据导出到 Excel 来计算所有这些统计数据,但它更耗时。我更愿意学习如何在 SQL 中执行此操作。

【问题讨论】:

  • 欢迎来到使用 SQL 的世界。这里的草很绿。
  • @mendosi - 谢谢伙计!

标签: sql sql-server sql-server-2012


【解决方案1】:
SELECT AVG(af.Prev_Reg_Amount)
FROM
    Animal_Facts af
    INNER JOIN Animal_Class ac
    ON af.Class_Key = ac.Class_Key
    AND Class_Description LIKE ('%pensioner%')

【讨论】:

  • 谢谢伙计,这绝对让我得到了我需要的数字,而且比使用 excel 快得多。
  • 有没有办法先建一个表,然后计算统计数据(我猜是用 Excel 的方式),或者这是计算平均值的最佳方法?
  • @BJJBA 确定您可以构建表格,但如果您想在生成表格的同时进行分组和其他操作,您将需要使用一些不同的技术。查看窗口函数 AVG() OVER ()、WITH CUBE、GROUPING SETS。 Excel 是一个前端工具。它也不会与表格同时创建统计信息,而是使用数据集来创建统计信息。 SQL 查询就像创建一个数据集,然后你只需在上面添加你想要的函数。因此,如果您想要上面的 AVG() 和 SUM(),只需在 SELECT AVG(), SUM() 之后创建另一个计算列.....
猜你喜欢
  • 1970-01-01
  • 2020-02-15
  • 2019-08-17
  • 2017-03-07
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
相关资源
最近更新 更多