Как усреднить только те поля, записи которых соответствуют определенным критериям в Access? - PullRequest
1 голос
/ 15 декабря 2011

У меня есть таблица ACCESS, которая называется «Средние значения оценки рецензента» и содержит информацию об обзорах компании, выполненных отдельными лицами, в следующем виде:

ID | Рецензент | Компания | ReviewScore

Поле Company может содержать только четыре значения:

Старбукс
MCDONALDS
GREENMOUNTAIN
CARIBOU

У нас есть запрос SQL, который усредняет все ReviewScores для данного Reviewer, но мы хотим изменить его так, чтобы он также вычислял среднее значение всех ReviewScores для компаний, отличных от CARIBOU.

Оригинальный функциональный запрос:

SELECT [Reviewer Score Averages].Reviewer, 
       Reviewers.[Last Name] & ", " & [First Name] AS Name, 
       Reviewers.[Email Address], 
       Avg([Reviewer Score Averages].[1stReviewScore]) AS AvgOfAllReviews;

Отредактированная версия, которая до сих пор не работает:

SELECT [Reviewer Score Averages].Reviewer, 
       Reviewers.[Last Name] & ", " & [First Name] AS Name, 
       Reviewers.[Email Address], 
       Avg([Reviewer Score Averages].[1stReviewScore]) AS AvgOfAllReviews, 
       Avg([Reviewer Score Averages].[1stReviewScore] 
WHERE [Reviewer Score Averages].[Company] = 'STARBUCKS' OR 'MCDONALDS' OR 'GREENMOUNTAIN') AS AvgOfNonCaribou;

Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке, что мне не хватает оператора: я посмотрел на документацию Microsoft для синтаксиса WHERE, но я не вижу в нем ничего, что Я явно скучаю.

Это таблица в базе данных Access 2003.

Что я делаю не так? Я неправильно использую ГДЕ? Мой синтаксис неправильный? Я что-то пропустил? Есть ли лучший способ решить проблему?

Большое спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Отсутствующий оператор определенно находится в WHERE [Reviewer Score Averages].[Company] = 'STARBUCKS' OR 'MCDONALDS' OR 'GREENMOUNTAIN'; как уже отмечали другие, в этом случае вам нужен оператор IN: WHERE [Reviewer Score Averages].[Company] IN ('STARBUCKS', 'MCDONALDS' , 'GREENMOUNTAIN').

Однако я не верю, что вы можете поместить предложение WHERE в предложение AVG. У меня нет Access 2003, поэтому я не могу подтвердить это для вас, но в 2010 году это даст желаемый результат и поможет вам определить правильный синтаксис для ваших реальных таблиц:

SELECT AVG(ReviewScore), AVG(SWITCH(COMPANY = 'Caribou', NULL, 1=1, ReviewScore)) as NotCaribou
FROM table1
1 голос
/ 15 декабря 2011

Почему бы просто не сделать:

...WHERE [Reviewer Score Averages].[Company] <> 'CARIBOU'

или, чтобы сделать вашу оригинальную работу:

...WHERE [Reviewer Score Averages].[Company] = 'STARBUCKS' 
      OR [Reviewer Score Averages].[Company] = 'MCDONALDS' 
      OR [Reviewer Score Averages].[Company] = 'GREENMOUNTAIN'

РЕДАКТИРОВАТЬ : Выделение @ Комментарий Рему:

...WHERE [Reviewer Score Averages].[Company] IN ('STARBUCKS', 'MCDONALDS', 'GREENMOUNTAIN')
0 голосов
/ 16 декабря 2011

Вместо использования SWTICH, встроенного в функцию AVG, рассмотрите возможность использования двух представлений, например

CREATE VIEW ReviewsAvgsAll
AS
SELECT Reviewer, 
       Avg([1stReviewScore]) AS AvgOfReviews
  FROM [Reviewer Score Averages] AS RSA
 GROUP 
    BY Reviewer;

CREATE VIEW ReviewsAvgsNonCARIBOU
AS
SELECT Reviewer, 
       Avg([1stReviewScore]) AS AvgOfReviews
  FROM [Reviewer Score Averages] AS RSA
 WHERE Company <> 'CARIBOU';
 GROUP 
    BY Reviewer;

Создайте эти ПРОСМОТРЫ обычным способом;обратите внимание, что для синтаксиса CREATE VIEW требуется Синтаксис запроса ANSI-92 .

Затем присоедините Reviewers к ReviewsAvgsAll и полусоединение к ReviewsAvgsNonCARIBOU вобычным способом.Вы пропустили предложение FROM, но предполагая, что общий атрибут равен Reviewer, он может выглядеть примерно так:

SELECT RAA.Reviewer, 
       R.[Last Name] & ", " & [First Name] AS Name, 
       R.[Email Address], 
       RAA.AvgOfReviews AS AvgOfAllReviews, 
       RAN.AvgOfReviews AS AvgOfNonCARIBOUReviews
  FROM Reviewers AS R       
       INNER JOIN ReviewsAvgsAll AS RAA
          ON R.Reviewer = RA.Reviewer
       INNER JOIN ReviewsAvgsNonCARIBOU AS RAN
          ON R.Reviewer = RAN.Reviewer
UNION
SELECT RAA.Reviewer, 
       R.[Last Name] & ", " & [First Name] AS Name, 
       R.[Email Address], 
       RAA.AvgOfReviews AS AvgOfAllReviews, 
       -1 AS AvgOfNonCARIBOUReviews
  FROM Reviewers AS R       
       INNER JOIN ReviewsAvgsAll AS RAA
          ON R.Reviewer = RA.Reviewer
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM ReviewsAvgsNonCARIBOU AS RAN
                    WHERE R.Reviewer = RAN.Reviewer
                  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...