「集計クエリで顧客ごとの注文件数を集計できた。でも”注文が3件以上の顧客だけ”に絞り込むにはどうすればいい?」——そのときに使うのがHaving句(HAVING条件)です。
Having句はWhere句と見た目が似ていますが、適用されるタイミングが根本的に異なります。Where句は集計前の個別レコードを絞り込み、Having句はGROUP BYで集計した後のグループを絞り込みます。この仕組みを理解することで、集計クエリの設計の幅が大きく広がります。
本記事では、Having句の仕組みと構文、デザインビューでの設定手順、Where句との使い分け、実務5パターンの設計例、そしてMOS Access試験での出題ポイントまでを体系的に解説します。
Having句とWhere句の根本的な違い
Having句とWhere句はどちらも「絞り込み」に使いますが、絞り込む対象が異なります。まず処理の流れから整理します。
SQLの処理順序で理解する
Accessがクエリを実行するとき、内部では次の順序で処理が進みます。
- FROM:対象テーブルを選択する
- WHERE:集計前の個別レコードを絞り込む
- GROUP BY:指定フィールドでレコードをグループ化し、集計関数(Count・Sum・Avgなど)を計算する
- HAVING:グループ化・集計後の結果をさらに絞り込む
- SELECT:出力するフィールドを決定する
- ORDER BY:結果を並べ替える
Where句はステップ2で動作するため、まだ集計が行われていない個別のレコードに対して条件を適用します。一方、Having句はステップ4で動作するため、グループごとの集計値(件数・合計・平均など)を条件に使えます。
具体例で違いを確認する
「受注テーブルから顧客ごとの注文件数を集計し、3件以上の顧客だけ取り出す」というケースを考えます。
| 句 | 動作タイミング | このケースでの動作 |
|---|---|---|
| Where句 | 集計前(個別レコード) | 使えない(「件数」はまだ計算されていない) |
| Having句 | 集計後(グループ単位) | Count(*) >= 3 のグループだけを残せる |
Where句の抽出条件に Count(*) >= 3 と書いても「集計値をWhere句で使うことはできません」というエラーが出ます。集計結果を条件に使うときは必ずHaving句(デザインビューでは「Having」行)に記述してください。
Having句の基本構文
Accessのデザインビューで集計クエリを作成すると、「集計」行と「Having」行が自動的に表示されます(SQLビューでは HAVING キーワードで記述します)。
デザインビューでHaving条件を設定する手順
- クエリをデザインビューで開く(または新規作成する)
- リボン「クエリデザイン」タブの「集計」ボタン(Σマーク)をクリックして集計行を表示する
- グループ化するフィールド(例:顧客ID)の「集計」セルを「グループ化」のままにする
- 集計フィールド(例:注文ID)の「集計」セルを「Count」に変更する
- 同じ集計フィールドの「Having」行に条件を入力する(例:
>=3) - クエリを実行(!ボタンまたは F5)して結果を確認する
注意:手順5で「Having」行が表示されない場合、デザインビューの列幅が狭く行が隠れている可能性があります。スクロールバーを使って「集計」「並べ替え」「表示」「抽出条件」「Having」「または」の各行を確認してください。
Having行に入力できる条件の例
| 集計関数 | Having行の条件記述 | 意味 |
|---|---|---|
| Count(件数) | >=3 | 3件以上のグループを残す |
| Count(件数) | Between 5 And 10 | 5件以上10件以下のグループ |
| Sum(合計) | >100000 | 合計金額が10万円超のグループ |
| Avg(平均) | >=50000 | 平均金額が5万円以上のグループ |
| Max(最大値) | < Date()-90 | 最大日付が90日以上前のグループ |
| Min(最小値) | >=1000 | 最小値が1000以上のグループ |
デザインビューとSQLビューの対応
デザインビューのHaving行に入力した内容は、SQLビューでは HAVING キーワードの後ろに自動的に変換されます。SQLビューでの記述例を示します。
SELECT 顧客ID, Count(*) AS 注文件数
FROM 受注テーブル
GROUP BY 顧客ID
HAVING Count(*) >= 3
ORDER BY Count(*) DESC;
SQLビューを使うとHaving句の全体構造を一目で確認でき、Where句との組み合わせも把握しやすくなります。デザインビューとSQLビューを行き来しながら設計するのが実務での定石です。
Having句の実務活用パターン5選
Having句を使う典型的な実務シナリオを5つ取り上げます。いずれもデザインビューで再現できます。
パターン1:注文件数が3件以上の顧客を抽出する
顧客テーブルと受注テーブルを結合し、顧客ごとの注文件数を集計したうえで、活発な顧客(3件以上)だけを取り出します。
| フィールド | テーブル | 集計 | Having |
|---|---|---|---|
| 顧客ID | 顧客テーブル | グループ化 | (空欄) |
| 顧客名 | 顧客テーブル | グループ化 | (空欄) |
| 注文ID | 受注テーブル | Count | >=3 |
このクエリを実行すると、「注文が3件以上ある顧客の一覧と件数」が表示されます。DM送付先の絞り込みや優良顧客の抽出といった場面で活用できます。
パターン2:平均受注金額が一定以上のカテゴリを抽出する
商品カテゴリごとに受注金額の平均を計算し、単価の高いカテゴリだけを取り出します。
| フィールド | 集計 | Having |
|---|---|---|
| カテゴリ名 | グループ化 | (空欄) |
| 受注金額 | Avg | >50000 |
平均受注金額が5万円を超えるカテゴリが一覧表示されます。粗利計算・在庫優先順位付けに使えるパターンです。
パターン3:最終受注日が90日以上前の担当者を特定する
担当者ごとに最後に受注した日付(Max(受注日付))を求め、90日以上前の担当者をリストアップします。フォローアップ対象の担当者管理に役立ちます。
| フィールド | 集計 | Having |
|---|---|---|
| 担当者名 | グループ化 | (空欄) |
| 受注日付 | Max | < Date()-90 |
Date() 関数は実行日の日付を返すため、この条件は「実行日の90日以上前が最終受注日であるグループ」を動的に抽出します。クエリを実行するたびに自動的に日付が更新されるので、定期レポートに組み込みやすいパターンです。
パターン4:Where句とHaving句を組み合わせる2段階絞り込み
Where句で集計前の個別レコードを期間で絞り込み、さらにHaving句で集計後の件数を絞り込む2段階のフィルタです。
| フィールド | 集計 | 抽出条件(Where) | Having |
|---|---|---|---|
| 顧客ID | グループ化 | (空欄) | (空欄) |
| 受注日付 | Where | Between #2026/01/01# And #2026/06/30# | (空欄) |
| 注文ID | Count | (空欄) | >=2 |
上の設定では、まず2026年上半期の受注レコードだけを対象にし(Where句)、その期間内に2件以上注文した顧客を取り出します(Having句)。Where句で先にデータ量を減らすことでパフォーマンスも向上します。
デザインビューでの注意:受注日付の「集計」セルを「グループ化」ではなく 「Where」 に変更すると、そのフィールドがWhere条件として機能し、かつ出力列に表示されなくなります。集計の「Where」と「グループ化」を使い分けることがポイントです。
パターン5:CountとSumを組み合わせた複数のHaving条件
1つのクエリ内で複数の集計フィールドにHaving条件を設定することも可能です。「注文件数が3件以上かつ合計金額が20万円以上の顧客」を取り出す例を示します。
| フィールド | 集計 | Having |
|---|---|---|
| 顧客ID | グループ化 | (空欄) |
| 注文ID | Count | >=3 |
| 受注金額 | Sum | >=200000 |
両方のHaving条件はAND(両方を満たす)として結合されます。OR条件にしたい場合はSQLビューで HAVING Count(*) >= 3 OR Sum(受注金額) >= 200000 のように記述してください。デザインビューのHaving行が複数ある場合、同一行の条件はAND、「または」行への記述はORとして扱われます。
Having句を使う際の注意点
NULLを含むグループの扱い
GROUP BYのキーフィールドにNULL値が含まれる場合、NULLのレコードは1つのグループとしてまとめられます。Having句の条件がNULLグループに適用されるかどうかはケースによって異なるため、Nz関数でNULLを別の値に変換してからグループ化するか、Where句で Is Not Null を使ってNULLレコードを事前に除外することを推奨します。
WHERE句で先に絞り込んでパフォーマンスを高める
Having句は集計後に条件を適用するため、大量データの場合は処理コストが高くなります。「集計前の段階で絞り込める条件」は可能な限りWhere句に書き、データ量を事前に減らすことがパフォーマンス改善の基本です。
| 条件の種類 | 推奨する書き方 | 理由 |
|---|---|---|
| 特定の期間のレコードのみ対象にする | Where句(集計セル「Where」) | 集計前に行数を減らせる |
| 集計後の件数・合計・平均で絞る | Having句 | 集計値はWhere句では使えない |
| グループ化フィールドの値(例:地域)で絞る | Where句を推奨(Having句でも動くが非効率) | 集計前に絞ったほうがデータ量が減る |
デザインビューの「Having」行と「抽出条件」行の違い
集計クエリのデザインビューには「抽出条件」行と「Having」行の2種類があります。
- 抽出条件行:集計セルが「グループ化」のフィールドに入力するとWhere句として機能する。集計セルが「Count」などの集計関数のフィールドに入力すると、Accessが自動的にHaving句として解釈する(バージョンによって挙動が異なるため注意)
- Having行:集計後の条件として常にHaving句に変換される。意図が明確になるため、集計値の絞り込みはHaving行に明示的に記述する習慣をつける
混乱を避けるために、集計値を条件にする場合は必ずHaving行を使い、個別レコードの絞り込みは抽出条件行(集計セルを「Where」に変更)に書くというルールで設計を統一することを推奨します。
フィールドの表示名(キャプション・エイリアス)の注意
デザインビューでフィールドに「注文件数: Count(注文ID)」のようにエイリアス(別名)を付けると、出力列の見出しが変わります。しかしHaving行には元の集計関数(Count(*)など)に基づいた条件を書く必要があります。エイリアス名をHaving行に書いてもAccessは認識しないため注意してください。
MOS Access試験でのHaving句の出題ポイント
MOS Access 365試験(MO-500)では、「クエリの作成と変更」スキル領域に集計クエリの操作が含まれます。Having句の操作も出題範囲に含まれます。分野別の出題数・配点は公表されていません。
試験の出題形式は、実際のAccessデータベースを操作してタスクをこなすマルチプロジェクト形式です。試験時間は50分、採点は1000点満点で、合格点は公表されていませんが550点~850点が目安とされています。
MOS試験 Having句チェックリスト
| 確認ポイント | 操作内容 | 難易度 |
|---|---|---|
| 集計行を表示できる | クエリデザインビューでリボン「集計」ボタン(Σ)をクリックして集計行を表示する | ★☆☆ |
| グループ化フィールドを設定できる | 集計セルのドロップダウンから「グループ化」を選択する | ★☆☆ |
| 集計関数(Count・Sum・Avg・Max・Min)を設定できる | 集計セルから目的の関数を選択する | ★★☆ |
| Having行に条件を入力できる | 集計フィールドのHaving行に >=3 などの条件を記述できる | ★★☆ |
| Where句と組み合わせられる | 期間絞り込みフィールドの集計セルを「Where」に変更し、抽出条件行に条件を書ける | ★★★ |
| SQLビューでHAVING句を確認できる | デザインビューとSQLビューを切り替えてHAVING句の記述を確認できる | ★★★ |
| Having条件とWhere条件を使い分けられる | 集計前と集計後それぞれにどちらの句を使うか正しく判断できる | ★★★ |
試験での注意点
- タスクに「集計クエリを作成し、件数が○件以上のグループを表示する」という指示がある場合、Having句を使うと判断できるかが問われる
- デザインビューでHaving行が表示されていない場合、スクロールで確認するか集計ボタンをクリックして集計行を表示する
- 「件数」「合計」「平均」など集計結果を条件にする場面では、抽出条件行(Where相当)に書かず必ずHaving行に書く
- 最新の受験料は公式サイトの「受験料・価格」(https://mos.odyssey-com.co.jp/exam/examfee.html)でご確認ください
まとめ:Having句でAccessの集計クエリに2段階フィルタを実装する
本記事のポイントをまとめます。
- Having句とは:GROUP BYで集計した後のグループを絞り込む条件。集計値(件数・合計・平均など)を条件に使いたいときに必要
- Where句との違い:Where句は集計前の個別レコードを絞り込む。集計後の値を条件にするときはWhere句ではなくHaving句を使う
- 設定手順:デザインビューで集計行を表示→集計フィールドのHaving行に条件を入力する
- 2段階絞り込み:Where句(集計前の期間絞り込み)とHaving句(集計後の件数・合計絞り込み)を組み合わせると効率的かつ高速なクエリを設計できる
- パフォーマンス:集計前に絞り込めるものはWhere句に書いてデータ量を減らすのが基本
- MOS試験では:集計クエリの作成とHaving行への条件記述を確実に習得しておく
Having句はSQLの標準的な機能であり、Accessのデザインビューから直感的に操作できます。GROUP BYとHaving句の組み合わせを使いこなせるようになると、集計レポートの精度が飛躍的に向上します。実務データベースで積極的に使い、MOS試験対策にも活かしてください。
PR
MOS試験シリーズの定番対策書。Access・Excel・Wordを含むMicrosoft 365全体の試験合格を目指す方に、出題範囲の網羅的な理解と模擬問題での実践演習が一冊でそろいます。クエリ設計の基本を試験形式で確認したい方にも適しています。
PR
Microsoft Copilot for Microsoft 365活用大全
Microsoft 365全体の活用法を網羅した一冊。AccessやExcelでのデータ集計・クエリ設計にCopilotをどう活かすかが具体的に解説されており、Having句などのSQL操作とAIアシスト機能を組み合わせた業務効率化を目指す方に参考になります。
