グループ化集計の結果に対する絞り込みと集計対象レコードの絞り込みの違い

 クエリでクループ化集計を行う際に、集計の対象となる数値列に対し抽出条件を設けたい場合があります。
 一口に抽出条件といっても「集計結果に対し条件を設けてグループを絞り込む」場合と「集計以前に集計対象となるレコードを絞り込む」場合の2通りが考えられ、当然ながらクエリデザイン上でも異なる設定の仕方が必要となります。
 何てことはないSQLにおけるWHEREとHAVINGの違いに過ぎませんが、クエリデザインで設定するとなると案外間違いやすいので、注意として記しておきます。

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

 なお、サンプルとして、このようなテーブルを用いるものとします。



集計結果に対する絞り込み

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

 まず普通にクエリでグループ化集計をし、チームごとの年俸合計を求めてみます。


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

 結果はこうなります。


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

 再度デザインビューです。今度は年俸列の抽出条件欄に「>=15000000」と記します。
 さて、この条件は見ようによっては「年俸が15000000以上であるメンバーのみを集計対象にする」というふうに読めなくもありませんが、実際は「合計が15000000以上であるグループを抽出する」という条件として機能します。


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

 そのことはデータシートビューを見れば明らかです。
 3つのチームのうち2つだけが抽出されていて、その合計は最初のクエリの結果と変わりありません。
 ちなみにですが、このクエリを一度閉じてデザインビューで開きなおすと、集計対象となっている年俸列の名前が「年俸の合計: 年俸」というように改められます。その状態で設定していれば答えはわかりやすかっただろうと思います。


集計対象レコードに対する絞り込み

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

 一方で、年俸が一定以上のメンバーのみを集計対象にするという場合は、どうやって設定すればいいのでしょうか。
 答えはこのようになります。年俸列をもう一つ設けて、「集計」欄の値を「Where条件」とし、そこで抽出条件を設定すればよいのです。ここでは具体的に「>=4500000」としてみます。
 なお、この「Where条件」とした列は条件設定のためだけの列ですので「表示」にチェックを入れるとエラーになります。


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

 データシートビューです。
 3つのチームとも合計が表示されますが、いずれのチームにも年俸4500000未満のメンバーが1人ずついますので、いずれの合計値も最初のクエリより小さいものとなります。