在做一些数据库工作时,遇到了一个奇怪的问题。我正在尝试在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));
答案 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的回答可能适用:
答案 2 :(得分:1)
虽然@ mwolfe02指出有意义,但在你的情况下,问题是不同的。您的FIRST查询存在两个问题:
因此,如果您使用以下查询(而不是第一个),您将获得匹配的结果:
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
这是发生了什么 -
该查询将获得每个人的所有访问的平均溃疡数量(该人居住在不属于阿巴拉契亚人或都市区的县)。
它假设Appalachian
和Metro
是布尔值(true/false
,或者显然在这里,yes/no
...) - 如果不是这种情况,则可能需要修改。