2011-12-15 162 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 
       );