5

MS Accessで次のようなクエリがあります

SELECT tblUsers.Forename, tblUsers.Surname, 
  (SELECT COUNT(ID) 
     FROM tblGrades 
     WHERE UserID = tblUsers.UserID 
     AND (Grade = 'A' OR Grade = 'B' OR Grade = 'C')) AS TotalGrades
FROM tblUsers

これをレポートに入れましたが、レポートを表示しようとすると、「マルチレベルの GROUP BY 句はサブクエリでは許可されていません」という警告が表示されます。

私が得られないのは、クエリに GROUP BY 句さえないのに、なぜこのエラーが返されるのですか?

4

3 に答える 3

10

アレンブラウンのアクセスのヒントの優れたウェブサイトから:生き残ったサブクエリ

エラー:「マルチレベルグループは許可されていません」

サブクエリを使用してクエリを作成し、すべてが機能することを確認するために30分を費やしました。クエリに基づいてレポートを作成すると、すぐに失敗します。なんで?

この問題は、レポートの並べ替えとグループ化または集計に応じてAccessが舞台裏で行うことから発生します。レポートのデータを集約する必要がある場合、それは許可されていない「マルチレベル」のグループ化です。

ソリューション

  • レポートデザインでは、[並べ替えとグループ化]ダイアログからすべてを削除し、レポートヘッダーまたはレポートフッターで何も合計しないでください。(ほとんどの場合、これは実用的な解決策ではありません。)

  • クエリデザインで、サブクエリの下の[表示]チェックボックスをオフにします。(このソリューションは、サブクエリの結果をレポートに表示する必要がない場合にのみ実用的です。)

  • サブクエリを処理する別のクエリを作成します。このクエリを、レポートの基になっているクエリのソース「テーブル」として使用します。サブクエリを下位レベルのクエリに移動すると、2番目のクエリが次のように単純な場合でも、問題が回避される場合があります(常にではありません)。

    SELECT * FROM Query1;

  • サブクエリの代わりに、DSum()などのドメイン集計関数を使用します。これは小さなテーブルには問題ありませんが、大きなテーブルにはパフォーマンスが使用できなくなります。

  • 他に何も機能しない場合は、レポートのデータを保持するための一時テーブルを作成します。クエリを追加クエリ(クエリデザインの[クエリに追加]メニュー)に変換して一時テーブルにデータを入力し、レポートを一時テーブルに基づいて作成できます。

重要な注意: Allen Browneが明示的に許可していると思うので、ここに情報を再投稿します。彼のウェブサイトから:

許可 これらの記事およびサンプルデータベースのあらゆるもの(コード、フォーム、アルゴリズムなど)を、あらゆる目的(個人、教育、商業、再販など)で自由に使用できます。私たちがお願いするのは、次のようなコメントを付けて、コードでこのWebサイトを承認することだけです。'ソース:http ://allenbrowne.com '適応元:http://allenbrowne.com

于 2012-04-23T20:15:13.190 に答える
3

このバージョンを試してください:

SELECT users.Forename, users.Surname, grades.TotalGrades
FROM tblUsers AS users
LEFT JOIN (SELECT COUNT(ID) as TotalGrades, UserID FROM tblGrades WHERE (Grade = 'A' OR Grade = 'B' OR Grade = 'C') group by userid) AS grades on grades.UserID = users.UserID

私はそれをテストしていません。クエリ自体は問題ないはずですが、レポート データ ソースで機能するかどうかはわかりません。

于 2012-04-23T16:55:43.057 に答える
0

これを試して:

SELECT users.Forename, users.Surname, count(grades.id) AS TotalGrades
FROM tblUsers AS users
INNER JOIN tblGrades AS grades ON users.ID=grades.UserID
WHERE grades.Grade in ("A","B","C") group by users.ID;

これは単純な結合テーブルです。基本的にはという意味です。ユーザーが「A」または「B」または「C」のグレードを持つすべてのケースを選択します (次のような表が得られます)。

   user1 | A 
   user1 | B 
   user1 | A 
   user2 | A 
   ...

次に、ユーザーごとにグループ化し、成績が表示された回数を数えます -> 各ユーザーの希望する範囲内の成績の数を示します。

于 2012-04-24T08:18:16.837 に答える