Access 2007中的平均函数返回奇怪的结果

时间:2011-07-28 15:26:40

标签: sql ms-access

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

使用avg功能:

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));

4 个答案:

答案 0 :(得分:3)

您所看到的差异的一个可能解释是第二个查询中的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,你至少有一部分答案是关于平均数不同意的原因。

答案 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.

答案 2 :(得分:1)

虽然@ mwolfe02指出有意义,但在你的情况下,问题是不同的。您的FIRST查询存在两个问题:

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

    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"))
    

答案 3 :(得分:0)

如果不知道数据库的确切布局,有点难以确定,但我怀疑你可能会收到重复的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 ...) - 如果不是这种情况,则可能需要修改。