「サブクエリでは、マルチレベルGROUP BY句は使用できません。」のエラーを回避する

f:id:accs2014:20170311120452p:plain:right:w400

 レポートにおけるエラー発生の回避策についてです。
 まず、対象となるエラーを再現してみます。
 右のようなテーブルがあります。


f:id:accs2014:20170311123652p:plain:right:w500

 クエリで次のような列を設けます。つまり「点数」列の値に基づきサブクエリによって順位を算出します。

順位: (SELECT COUNT(*) FROM 成績テーブル AS 成績テーブル_1 WHERE 成績テーブル_1.点数 > 成績テーブル.点数)+1


f:id:accs2014:20170311123651p:plain:right:w500

 データシートビューです。点数の高い順に1から順位が表示されています。


f:id:accs2014:20170311123650p:plain:right:w400

 次に、このクエリをレコードソースとするレポートを作成します。
 特に難しいところはないレポートですが、グループヘッダーを置いている点に注意してください。


f:id:accs2014:20170311123711p:plain:right:w600

 さて、このレポートを印刷プレビュー等で表示しようとすると、「サブクエリでは、マルチレベルGROUP BY句は使用できません。」というエラーが出ます。
 このエラーはたいていサブクエリのあるクエリと、グループヘッダーのあるレポートの組み合わせで起こります。いずれにせよクエリには異状はなく、それをそのままレポートに流しただけなのにエラーとなってしまうという事態はどうも腑に落ちませんし、苦労して作ったサブクエリが役に立たないという困った事態に陥ってしまいます。


f:id:accs2014:20170311123710p:plain:right:w500

 そこで対策ですが、最初に作ったクエリに基づく別のクエリを作成します。出力する列も全くそのままです。
 ただし、このクエリでグループ化を行ってください(この例の場合、グループ化しなくともエラーは回避できますがレポートでの順位の表示がおかしくなるなど不具合が出ます。また、最初のレポートでグループ化しようとするとクエリそのものがエラーとなります)。


f:id:accs2014:20170311123709p:plain:right:w400

 このクエリをレコードソースにすると、レポートは無事に表示されます;-o-)

 なお、サブクエリではなく定義域集合関数(この例ではDCount関数)を用いるといった対策も考えられますので、状況に応じて選択してください。