【问题标题】:Average function in Access 2007 returning strange resultsAccess 2007 中的平均函数返回奇怪的结果
【发布时间】:2011-07-28 15:26:39
【问题描述】:

在做一些数据库工作时,我遇到了一个奇怪的问题。我正在尝试对特定人群使用 Access 中的内置平均函数。当我运行查询时,我得到的答案与我查找个人然后平均这些值时不同。有没有人注意到下面的 SQL 中有任何内容可以给出两个不同的答案?

使用平均函数:

SELECT DISTINCT tblKentuckyCounties.Appalachian, tblKentuckyCounties.Metro, Avg(Visits.admitNumUlcers) AS AvgOfadmitNumUlcers
FROM (tblKentuckyCounties INNER JOIN Person ON tblKentuckyCounties.ID = Person.County) INNER JOIN Visits ON Person.PersonID = Visits.PersonID
GROUP BY tblKentuckyCounties.Appalachian, tblKentuckyCounties.Metro
HAVING (((tblKentuckyCounties.Appalachian)=No) AND ((tblKentuckyCounties.Metro)=No))

;

单独查找记录:

SELECT DISTINCT tblKentuckyCounties.Appalachian, tblKentuckyCounties.Metro, Visits.admitNumUlcers, Person.PersonID
FROM (tblKentuckyCounties INNER JOIN Person ON tblKentuckyCounties.ID = Person.County) INNER JOIN Visits ON Person.PersonID = Visits.PersonID
GROUP BY tblKentuckyCounties.Appalachian, tblKentuckyCounties.Metro, Visits.admitNumUlcers, Person.PersonID
HAVING (((tblKentuckyCounties.Appalachian)=No) AND ((tblKentuckyCounties.Metro)=No));

【问题讨论】:

  • DISTINCT 在这些查询中毫无意义。我并不是说它会造成问题,但建议你还是摆脱它。
  • @HansUp - 你是对的。 DISTINCT(仅在第一个查询中)是问题的一部分。请参阅下面的答案...
  • @Igor Turman 该查询按阿巴拉契亚和 Metro 进行分组,并为 admissionNumUlcers 生成一个组平均值。为了使 DISTINCT 有所作为,您需要假设两个组对于这 3 个字段表达式具有相同的值。该查询中使用的 GROUP BY 怎么可能发生这种情况?
  • @HansUp - 对你的第一条评论投赞成票是我的 :)
  • @Igor Turman 谢谢,我猜。 :-) 我想说的是 GROUP BY 在这里单独返回不同的行。添加关键字 DISTINCT 不会做出任何贡献……因为它不会更改结果集。所以删除关键字 DISTINCT 也不会改变任何东西。 (我认为这可能是你和我显然不同意的一点。)

标签: sql ms-access


【解决方案1】:

您看到的差异的一个可能解释是第二个查询中的这个 GROUP BY:

GROUP BY
    tblKentuckyCounties.Appalachian,
    tblKentuckyCounties.Metro,
    Visits.admitNumUlcers,
    Person.PersonID

任何与这 4 个字段重复的行都将汇总到一个组中。通过更改第二个查询的字段列表来检查:

SELECT 
    tblKentuckyCounties.Appalachian,
    tblKentuckyCounties.Metro,
    Visits.admitNumUlcers,
    Person.PersonID,
    Count(*) AS rows_in_group

如果 rows_in_group > 1,那么您至少可以部分回答平均值不一致的原因。

【讨论】:

  • 我知道有些记录会合二为一,只是不知道具体在哪里。多谢,伙计! :)
【解决方案2】:

我不能确定,因为当您“单独查找记录”时,我不确切知道您在计算平均值时会做什么,但我相信@Dale Halliwell 的回答可能适用:

An average of average values will not return the same result as a single average over all values, unless all the groups averaged have the same number of items.

【讨论】:

  • 当我使用第二个查询时,我复制并粘贴到 Excel 中,然后使用平均函数。
【解决方案3】:

虽然@mwolfe02 指出的内容是有道理的,但在您的情况下,问题是不同的。您的第一个查询有两个问题:

  1. 不同
  2. 分组依据

因此,如果您使用以下查询(而不是第一个),您将获得匹配的结果:

SELECT tblKentuckyCounties.Appalachian, tblKentuckyCounties.Metro, Visits.admitNumUlcers, Person.PersonID
FROM (tblKentuckyCounties INNER JOIN Person ON tblKentuckyCounties.ID = Person.County) INNER JOIN Visits ON Person.PersonID = Visits.PersonID
WHERE (((tblKentuckyCounties.Appalachian)="No") AND ((tblKentuckyCounties.Metro)="No"))

【讨论】:

    【解决方案4】:

    在不知道数据库的确切布局的情况下,有点难以确定,但我暗中怀疑您可能会得到重复的 Person 记录。如果用户拥有多个visit,会发生什么情况?然后,由于其中一个查询请求唯一 PersonId 记录,而另一个不请求,您将获得不同的记录数。
    您将不得不决定是要所有访问的平均值,还是只需要一次访问,或者什么(您的问题中没有明确说明)。
    您所写的查询感觉有点……有趣?试试这个:

    SELECT a.PersonId, AVG(b.admitNumUlcers)
    FROM (Person as a
          INNER JOIN Visits as b
          ON b.PersonId = a.PersonId)
          INNER JOIN tblKentuckyCounties as c
          ON (c.ID = a.County
              AND c.Appalachian = No
              AND c.Metro = No) 
    GROUP BY a.PersonId
    

    这是发生了什么 -
    此查询将为您提供每个人的平均溃疡数,在他们所有的访问中(该人居住在一个不在阿巴拉契亚山脉或都市区的县)。 它假定 AppalachianMetro 是布尔值(true/false,或者显然在这里,yes/no...) - 如果不是这种情况,则可能需要修改。

    【讨论】:

    • 仅供参考:您需要括号来获取具有多个连接的查询,以便在 Jet/ACE(Access 数据库引擎)中运行。
    • 添加了括号。感觉像是一个奇怪的限制 - 这是正确的吗?
    • 抱歉,我没有可玩的副本 - 我当然回答了我在 DB2 方面的经验。
    • 通常我会,是的 - 但是,我认为至少我用 DB2 所做的一些东西应该翻译。不过,很高兴知道出了什么问题。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多