2011-12-15 13 views
1

私は、個人が行った企業レビューに関する情報を含むReviewer Score Averagesという名前のACCESSテーブルを持っています。Accessでレコードが特定の条件を満たすフィールドのみ平均化するには?

ID |レビューア|会社| ReviewScore

Companyフィールドが4つのしか値を保持することができます:

STARBUCKS
をマクドナルド
GREENMOUNTAIN
CARIBOU

私たちは、与えられたレビューの平均値すべてReviewScoresというSQLクエリを持っていますが、欲しいです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構文のMicrosoftのdocumentationを見ましたが、明らかに欠けていることはありません。

これはAccess 2003データベースのテーブルです。

私は間違っていますか?私はどこを悪用していますか?私の構文は間違っていますか?何か不足していますか?問題にアプローチするより良い方法はありますか?

ご協力いただきありがとうございます。

+0

我々はいくつかの詳細が欠けている、特に 'FROM'句、どのようにテーブルの' [レビュースコアの平均を明らかにする] 'と' Reviewers'が結合され、 'GROUP BY'節も役立ちます。理想的には、テーブルスキーマ、テストデータ、期待される結果を掲示することができます:) – onedaywhen

答えて

1

欠落をオペレータは間違いなくWHERE [Reviewer Score Averages].[Company] = 'STARBUCKS' OR 'MCDONALDS' OR 'GREENMOUNTAIN'です。他の人が指摘しているように、この場合はIN演算子が必要です:WHERE [Reviewer Score Averages].[Company] IN ('STARBUCKS', 'MCDONALDS' , 'GREENMOUNTAIN')

しかし、AVG句の中にWHERE句を入れることはできません。私は、私はあなたのためにこれを確認することはできませんアクセス2003を持っていないが、2010年には、これは望ましい結果を与え、あなたはあなたの本当のテーブルのための右の構文を理解するのに役立ちます:

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

私はこれがそれだと思う:スイッチは行く道に見える。私が実際に使っているテーブルの実際のコードは、他の理由からまだまだバグですが、私はこのデータベースを例として設定したCoffeeデータベースでテストしました。それは夢のように機能します。助けてくれてありがとう@sfuqua。 –

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' 

EDIT:Remouさんのコメント@肉付け:

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

INでアクセスしても十分です。 – Fionnuala

+0

両方とも呼び出しが良い - これらはもともとあったコードよりも洗練されており、構文の問題の一部を修正しています。私は、sfuquaが正しいと思うのは、AVG句の中のWHERE句が根本的な問題だと思います。 –

0

よりもむしろSWTICHを使用してAVG関数とインラインで、2つのビュー、

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が必要です。

通常の方法でReviewersReviewsAvgsAllsemi-join〜に参加します。あなたの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 
       ); 
関連する問題