2011-12-15 160 views
1

我有一个名为Reviewer Score平均值的ACCESS表,其中包含有关个人完成的公司评论的信息,结构如下:如何平均只有记录符合Access中某些条件的字段?

ID |审阅者|公司| ReviewScore

公司现场只能容纳四个值:

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

当我尝试运行这段代码,我得到一个错误我错过了一个操作符的消息:我查看了微软的WHERE语法的documentation,但是我没有看到任何明显缺失的东西。

这是Access 2003数据库中的表。

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

非常感谢您的帮助。

+0

我们缺少一些细节,尤其是`FROM`条款,这将揭示如何表`[点评人评分平均值]`和`Reviewers`可以加入,'GROUP BY`子句也会有帮助。理想情况下,您可以发布表格模式,测试数据和预期结果:) – onedaywhen 2011-12-16 09:32:31

回答

1

失踪运营商绝对在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

为什么不只是做:

...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') 
+0

使用IN也足够快乐。 – Fionnuala 2011-12-15 19:22:49

+0

好的调用 - 这些比我最初的代码更优雅,并修复了我的语法问题的一部分。不过,我认为sfuqua是正确的,更为基本的问题是AVG子句中的WHERE子句。 – 2011-12-15 20:42:54

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; 

以通常的方式创建这些视图;请注意0​​语法要求ANSI-92 Query Syntax

然后以常规方式加入ReviewersReviewsAvgsAllsemi-joinReviewsAvgsNonCARIBOU。你已经忽略你的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 
       );