如何平均只有记录符合Access中某些条件的字段?
我有一个名为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数据库中的表。
我在做什么错?我滥用哪里?我的语法错了吗?我错过了什么吗?有没有更好的方法来解决这个问题?
非常感谢您的帮助。
失踪运营商绝对在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
为什么不只是做:
...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')
使用IN也足够快乐。 – Fionnuala 2011-12-15 19:22:49
好的调用 - 这些比我最初的代码更优雅,并修复了我的语法问题的一部分。不过,我认为sfuqua是正确的,更为基本的问题是AVG子句中的WHERE子句。 – 2011-12-15 20:42:54
而不是使用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;
以通常的方式创建这些视图;请注意0语法要求ANSI-92 Query Syntax。
然后以常规方式加入Reviewers
至ReviewsAvgsAll
和semi-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
);
我们缺少一些细节,尤其是`FROM`条款,这将揭示如何表`[点评人评分平均值]`和`Reviewers`可以加入,'GROUP BY`子句也会有帮助。理想情况下,您可以发布表格模式,测试数据和预期结果:) – onedaywhen 2011-12-16 09:32:31