如何仅对其记录满足Access中某些条件的字段进行平均?

时间:2011-12-15 18:54:43

标签: sql ms-access

我有一个名为Reviewer Score Averages的ACCESS表,其中包含个人完成的公司评论信息,结构如下:

ID |评论员|公司| ReviewScore

公司字段只能包含四个值:

星巴克 MCDONALDS
GREENMOUNTAIN
CARIBOU

我们有一个SQL查询,它平均给定审阅者的所有ReviewScores,但是想要修改它,以便它还计算除CARIBOU以外的公司的所有ReviewScores的平均值。

原始的功能性查询是:

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的documentation的WHERE语法,但是我没有看到任何内容。我显然失踪了。

这是Access 2003数据库中的表。

我做错了什么?我在滥用WHERE吗?我的语法错了吗?我错过了什么吗?有没有更好的方法来解决这个问题?

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

为什么不这样做:

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

或者,为了使你的原创作品:

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

编辑:充实@ Remou的评论:

...WHERE [Reviewer Score Averages].[Company] IN ('STARBUCKS', 'MCDONALDS', 'GREENMOUNTAIN')

答案 1 :(得分:1)

缺少的运算符肯定在WHERE [Reviewer Score Averages].[Company] = 'STARBUCKS' OR 'MCDONALDS' OR 'GREENMOUNTAIN';正如其他人所指出的那样,在这种情况下你需要IN运算符:WHERE [Reviewer Score Averages].[Company] IN ('STARBUCKS', 'MCDONALDS' , 'GREENMOUNTAIN')

但是,我不相信你可以在AVG子句中放置一个WHERE子句。我没有Access 2003,因此我无法为您确认,但在2010年,这会给出所需的结果,并帮助您找出真实表格的正确语法:

SELECT AVG(ReviewScore), AVG(SWITCH(COMPANY = 'Caribou', NULL, 1=1, ReviewScore)) as NotCaribou
FROM table1

答案 2 :(得分:0)

不要使用SWTICHAVG函数内联,而是考虑使用两个视图,例如

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;

以通常的方式创建这些VIEW;请注意CREATE VIEW语法需要ANSI-92 Query Syntax

然后以常规方式将Reviewers加入ReviewsAvgsAllsemi-join加入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
                  );