Средняя функция в Access 2007, возвращающая странные результаты - PullRequest
0 голосов
/ 28 июля 2011

При работе с базами данных я столкнулся со странной проблемой. Я пытаюсь использовать встроенную среднюю функцию в 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 ]

3 голосов
/ 28 июля 2011

Одно из возможных объяснений разницы, которую вы видите, - это 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

Если row_in_group> 1, у вас есть хотя бы часть ответа о том, почему средние значения не совпадают.

2 голосов
/ 28 июля 2011

Я не могу быть уверен, потому что я не знаю точно, что вы делаете, чтобы рассчитать среднее значение, когда вы «просматриваете записи по отдельности», но я думаю, что этот ответ от @Dale Halliwell может быть применим:

Среднее из средних значений не будет возвращать тот же результат, что и одно среднее для всех значений, если только во всех усредненных группах не будет одинакового количества элементов.

1 голос
/ 28 июля 2011

Хотя то, на что указал @ mwolfe02, имеет смысл, в вашем случае проблема в другом. Есть два вопроса с вашим первым запросом:

  1. DISTINCT
  2. GROUP BY

Итак, если вы используете следующий запрос (вместо первого), вы получите совпадающие результаты:

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"))
0 голосов
/ 28 июля 2011

Не зная точного расположения вашей базы данных, немного трудно быть уверенным, но у меня есть скрытое подозрение, что вы можете получать дубликаты 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 ...) - если это не так, то, возможно, потребуется изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...