我有一个名为Reviewer Score Averages的ACCESS表,其中包含个人完成的公司评论信息,结构如下:
ID |评论员|公司| ReviewScore
公司字段只能包含四个值:
星巴克 MCDONALDS我们有一个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吗?我的语法错了吗?我错过了什么吗?有没有更好的方法来解决这个问题?
非常感谢你的帮助。
答案 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)
不要使用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;
以通常的方式创建这些VIEW;请注意CREATE VIEW
语法需要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
);