Accessクエリでグループ化して集計 合計 件数 月別集計を解説

概要

この記事の結論
Accessでグループ別に集計するには、クエリのデザインビューで[集計]を表示し、まとめる項目を[グループ化]、金額などを[合計]に設定します。売上金額は数量と単価を明細ごとに掛けてから合計します。条件や結合で対象データが変わるため、最後に元明細と件数・総額を照合することが大切です。
グループ化とは、同じキーを持つ行を一つのまとまりにする操作です。得意先別・商品別・年月別など、結果の1行が何を表すかを決めると、集計項目も選びやすくなります。

この記事でわかること

  • 得意先IDでまとめ、数量と単価から売上合計を求める手順
  • Sum、Count、Avgの使い分けとNullの扱い
  • WHEREとHAVINGによる条件指定、年を含めた月別集計
  • 結合による二重計上の防止と、集計結果の検算方法

この記事の主な内容

  1. グループ化と集計単位を決める
  2. 明細データと売上金額を準備する
  3. デザインビューで集計クエリを作る
  4. 合計 件数 平均とNullの違い
  5. 条件付き集計と年月別の集計
  6. 二重計上と集計エラーを検算する
  7. よくある質問

想定読了時間:約15分~20分


1 グループ化と集計単位を決める

グループ化する項目は「結果の1行を何単位にするか」で決めます。得意先別なら得意先ID、得意先別かつ商品別なら得意先IDと商品IDです。項目を追加するほど、結果は細かく分かれます。[2]

たとえば、得意先Aの明細が3行あっても、得意先IDだけでグループ化すればAの結果は1行になります。一方、明細IDまでグループ化に含めると、明細ごとに分かれたままです。「集計したのに行数が減らない」ときは、まずこの設定を見直してください。

知りたいことグループ化する項目計算する項目
得意先別の売上得意先ID明細金額の合計
商品別の販売数量商品ID数量の合計
得意先別かつ商品別の売上得意先ID、商品ID明細金額の合計
年月別の売上年と月を表す集計キー明細金額の合計

名称ではなくIDを集計の基準にする

得意先名だけでまとめると、同名の別会社が混ざったり、表記ゆれで同じ会社が分かれたりします。原則として一意の得意先IDを基準に集計し、表示用の名称は得意先マスターから取得します。

名称を後から付ける場合も、マスターの得意先IDが一意であることを確認してください。集計結果の1行に複数の名称行が結び付くと、せっかくまとめた結果が再び増えてしまいます。

得意先別や商品別などの集計単位を決め、まとめる項目と計算する項目を分ける手順

データシートの合計行との違い

データシート最下部に表示する[集計]行は、表示中のデータの総計を確認するときに便利です。一方、得意先ごとの結果を行として保存し、帳票などから再利用したい場合は、デザインビューで集計クエリを作成します。[1]

本記事では「明細金額を計算するクエリ」と「グループ別に合計するクエリ」を分けます。どの段階で数値が変わったか追いやすく、後から月別条件などを追加するときにも確認しやすい構成です。


2 明細データと売上金額を準備する

売上は、各行の「数量×単価」を求めてから合計します。単価の合計や「数量合計×単価合計」は、売上合計ではありません。ここでは税・値引き・端数処理を含めない架空の売上データで操作を説明します。

本番ファイルのコピーか学習用の新規データベースで試してください。既存の集計クエリを上書きすると、それを参照するフォームやレポートにも影響するため、最初は別名で保存します。

教材テーブルの項目とデータ型

テーブル名を「T_売上明細」とします。学習用に以下の項目を作成してください。ここで使う数量は正の整数、単価は0以上、必須項目にNullはない前提です。実際の業務では返品や取消の扱いを別途決めます。

フィールド名データ型設定と役割
明細ID数値型 長整数型主キー。各明細を一意に識別
伝票ID短いテキスト同じ伝票の複数明細で共通。必須
売上日日付/時刻型売上の計上日。必須
得意先ID短いテキストA、Bなどのコード。必須
商品ID短いテキストP01、P02などのコード。必須
数量数値型 長整数型販売した個数。必須
単価通貨型1個当たりの金額。必須
備考短いテキスト任意。Nullと件数の説明にも使用

次の5行を入力します。「Null」は文字列として入力せず、未入力の状態にしてください。下表は紙幅のため備考列を省略しています。備考は明細ID 1だけ「通常」と入力し、2~5は未入力にします。

明細ID伝票ID売上日得意先ID商品ID数量単価
1S0012026/01/10AP0121,000
2S0012026/01/10AP0213,000
3S0022026/01/20BP0131,000
4S0032026/02/05AP0141,000
5S0042025/01/15AP0111,000

明細金額を計算するクエリを保存する

[作成]から[クエリデザイン]を開き、「T_売上明細」を追加します。必要なフィールドを下段のデザイングリッドへ追加し、空いている列の[フィールド]に次の式を入力します。この段階では集計行を使いません。

明細金額: [数量]*[単価]

データシートビューで、明細ID 1から順に2,000円、3,000円、3,000円、4,000円、1,000円になることを確認し、「Q_売上明細金額」として保存します。5行の金額を足すと13,000円です。

SQLビューを使う場合は、同じ処理を次の選択クエリで作成できます。SQLは1つずつ新しいクエリに貼り付け、記載の名前で保存してください。以降の例は、このクエリが保存されている前提です。

SELECT [明細ID], [伝票ID], [売上日],
       [得意先ID], [商品ID], [数量], [単価], [備考],
       [数量]*[単価] AS [明細金額]
FROM [T_売上明細];

各明細の数量と単価を掛けて明細金額を計算し、その金額をグループ別に合計する流れ

実務では、税込・税抜、明細単位の丸め、伝票単位の値引きなどで金額の定義が変わります。教材の式をそのまま採用せず、既存帳票で使っている売上金額の定義と揃えてください。


3 デザインビューで集計クエリを作る

「Q_売上明細金額」を基に、得意先IDを[グループ化]、明細金額を[合計]にします。集計前の明細と集計後の結果を分けることで、式と集計単位を個別に確かめられます。

得意先別売上を作る操作手順

1.[作成]→[クエリデザイン]を開きます。
2.追加対象からクエリ「Q_売上明細金額」を選び、追加します。
3.「得意先ID」と「明細金額」を下段のグリッドへ追加します。
4.リボンの[集計]ボタン(Σ)を押し、グリッドの[集計]行を表示します。
5.得意先IDを[グループ化]、明細金額を[合計]に設定します。
6.得意先IDを昇順にし、データシートビューで結果を表示します。
7.Aが10,000円、Bが3,000円であることを確認し、「Q_得意先別売上」として保存します。

グリッドの行1列目2列目
フィールド得意先ID売上合計: 明細金額
集計グループ化合計
並べ替え昇順指定なし
表示オンオン

「売上合計: 明細金額」のようにコロンの前へ名前を書くと、結果の列見出しを指定できます。名称を付けずに実行すると自動の見出しになるため、他の帳票で利用する場合は分かりやすい名前を付けます。

元クエリを追加し、集計行を表示して得意先IDをグループ化、明細金額を合計に設定する四つの手順

SQLで確認する場合

上の設定は、次のSQLに対応します。GROUP BYにまとめる項目、Sumに足し合わせる項目を書きます。集計対象を商品別に変えるなら、SELECTとGROUP BYの両方を商品IDへ変更します。[2][5]

SELECT [得意先ID], Sum([明細金額]) AS [売上合計]
FROM [Q_売上明細金額]
GROUP BY [得意先ID]
ORDER BY [得意先ID];

得意先ID売上合計
A10,000
B3,000

明細の金額2,000+3,000+3,000+4,000+1,000=13,000円と、集計後の10,000+3,000=13,000円が一致します。この照合は、同じ対象データで、集計結果をHAVINGなどで絞っていない場合に行います。

設定が反映されない場合に見るところ

明細IDや売上日を[グループ化]のまま残すと、得意先以外の単位でも分割されます。まず表示したい列を必要最小限にし、元クエリのフィルターや抽出条件も確認してください。

既存の帳票と値が合わず、どのクエリが使われているか分からない場合は、帳票名・対象期間・期待する金額を整理すると調査が進めやすくなります。


4 合計 件数 平均とNullの違い

合計にはSum、行数にはCount、単純平均にはAvgを使います。ただし「何を1件と数えるか」「未入力をどう扱うか」によって答えは変わります。表示された数字だけで判断せず、集計式の分母と対象を確認してください。

式求める値Nullの扱い
Sum([明細金額])明細金額の合計Nullの値は合計に含めない
Count(*)対象の行数Nullを含む行も数える
Count([備考])備考にNull以外が入った行数Nullの行は数えない
Avg([単価])単価の単純平均Nullを除いた値の数で割る

Countで明細件数を数える

教材の全5行に対してCount(*)は5です。一方、備考を入力したのは明細ID 1だけなのでCount([備考])は1になります。空文字列とNullは別物のため、取り込みデータの見た目が空欄でも同じ扱いとは限りません。[4]

SELECT Count(*) AS [明細件数],
       Count([備考]) AS [備考入力件数]
FROM [T_売上明細];

得意先ごとに明細件数を出したい場合は、SELECTに得意先IDとCount(*)を並べ、GROUP BYに得意先IDを指定します。教材ではAが4件、Bが1件です。デザインビューでは、Nullにならない主キーの明細IDを追加して[カウント]に設定しても行数を求められます。

伝票件数は重複を除いてから数える

教材の伝票S001には明細が2行あります。そのため、明細件数5件に対して伝票件数は4件です。伝票IDをそのままCountしても重複は除かれません。

Accessの通常の選択クエリでは、次のようにDISTINCTで得意先IDと伝票IDの組み合わせを先に抽出します。保存名は「Q_得意先伝票一覧」です。この教材では伝票IDが伝票全体で一意で、各伝票は一つの得意先に属する前提です。

SELECT DISTINCT [得意先ID], [伝票ID]
FROM [T_売上明細];
SELECT [得意先ID], Count(*) AS [伝票件数]
FROM [Q_得意先伝票一覧]
GROUP BY [得意先ID];

結果はAが3件、Bが1件です。伝票番号が年度や拠点ごとに再利用されるシステムでは、それらを含めた本来の伝票キーで重複を除きます。期間を絞る場合は、伝票一覧を作る前の明細に期間条件を適用してください。

単純平均と加重平均を区別する

Avg([単価])は各明細の単価を同じ重みで平均します。教材全体では(1,000+3,000+1,000+1,000+1,000)÷5=1,400円です。販売数量の違いは、この平均には反映されません。[6]

一方、販売した1個当たりの平均金額を求めるなら、売上合計13,000円÷数量合計11個で約1,181.82円です。このように数量を重みとする平均を加重平均と呼びます。同じ単位で比較できる商品に限って計算するなど、平均の意味も確認します。

数量が正の値で欠損がない教材では「Sum([明細金額])/Sum([数量])」で計算できます。実務では返品相殺などで分母が0になる場合があるため、まず合計クエリを保存して数量合計が0のグループを確認し、除外や空欄表示の方針を決めてください。

Sumは合計、Countのアスタリスク指定は行数、項目指定はNull以外の件数、Avgは単純平均を求める違い

Nullを安易に0へ置き換えない

Nullは値が不明・未入力である状態です。数量か単価がNullなら、その行の掛け算もNullになり、Sumで見落とされる可能性があります。集計前に「数量 Is Null Or 単価 Is Null」の選択クエリで欠損行を確認します。

Nz([数量],0)のように書けば、Nullを指定値の0へ置き換えられます。[7] ただし、単価未確定の売上を0円として確定扱いにすると、実態より小さい売上が完成したように見えます。入力不備は修正し、0が業務上正しい場合だけ変換してください。


5 条件付き集計と年月別の集計

対象明細を先に絞る条件はWHERE、合計後のグループを絞る条件はHAVINGです。期間を限定してから売上の大きい得意先を探す場合は、この二つを順に適用します。[3]

WHEREとHAVINGを使い分ける

「2026年1月の明細だけを対象に、売上合計が4,000円以上の得意先」を出す例です。WHEREで1月の3明細を選び、得意先別に合計した後、HAVINGで4,000円以上のグループを残します。

SELECT [得意先ID], Sum([明細金額]) AS [売上合計]
FROM [Q_売上明細金額]
WHERE [売上日] >= DateSerial(2026,1,1)
  AND [売上日] < DateSerial(2026,2,1)
GROUP BY [得意先ID]
HAVING Sum([明細金額]) >= 4000;

WHERE適用後はAが5,000円、Bが3,000円です。HAVING適用後はAの5,000円だけが残ります。合計後に絞った結果を、1月全体の8,000円とそのまま比較して「不一致」と判断しないようにします。

終了条件を「翌月1日未満」にすると、時刻を含む1月31日の売上も対象になります。「1月31日以下」では1月31日の0時より後を漏らす場合があるため、日付/時刻型のデータでは境界を意識してください。

デザインビューでの列集計行抽出条件表示
得意先IDグループ化なしオン
売上合計: 明細金額合計>=4000オン
売上日Where条件>=DateSerial(2026,1,1) And <DateSerial(2026,2,1)オフ

UIの[Where条件]は集計前の対象選択に使います。売上日を[グループ化]にしたまま条件を入れると、日付ごとのグループもできるため、意図した得意先別集計と異なる結果になります。

WHEREで集計前の明細を絞り、グループごとに集計した後、HAVINGで集計結果を絞る順序

月別集計は年も含める

Month([売上日])だけでまとめると、2025年1月と2026年1月が同じ「1月」に合算されます。教材では両年の1月が混ざると9,000円になり、2026年1月の8,000円を取り出せなくなります。

年と月を保持する集計キーとして、各売上日の月初日を使うと便利です。DateSerialは指定した年・月・日から日付を作る関数です。[8] 以下を「Q_年月別売上」として保存します。この例は売上日が必須でNullがない前提です。

SELECT DateSerial(Year([売上日]),Month([売上日]),1)
         AS [集計月],
       Sum([明細金額]) AS [売上合計]
FROM [Q_売上明細金額]
GROUP BY DateSerial(Year([売上日]),Month([売上日]),1)
ORDER BY DateSerial(Year([売上日]),Month([売上日]),1);

集計月売上合計
2025/01/011,000
2026/01/018,000
2026/02/014,000

集計月は日付のまま保持し、フィールドの[書式]を「yyyy年mm月」などに設定すると、年月表示と日付順の並べ替えを両立できます。Format関数で文字列に変換する方法もありますが、表示と集計キーを分けておくと後の条件指定が分かりやすくなります。

データがない月も表示する場合

通常のGROUP BYだけでは、明細のない月の行は作られません。0円の月も並べるなら、対象期間の月初日を並べた「月一覧」テーブルを用意し、月一覧から月別集計へ左外部結合します。欠けた月の金額だけをNzで0表示にします。

得意先別かつ月別で0件の組み合わせも出す場合は、得意先と月の組み合わせ一覧が必要です。必要な期間と得意先を先に限定し、不要な組み合わせを大量に作らないように設計します。

月だけで別の年を混ぜず、年と月を含む月初日を集計キーにして年月順に表示する考え方

6 二重計上と集計エラーを検算する

集計値が増えすぎるときは、Sumの式だけでなく、その手前の結合結果を確認します。一つの売上明細に複数の行が結び付くと、同じ金額が複数回足されます。数値を合わせるための除算や重複削除を先に行わず、行が増えた理由を特定してください。

結合で同じ明細が繰り返される仕組み

たとえば、Aの売上明細が3行あり、別テーブルにAの担当者が2人登録されているとします。得意先IDだけで結合すると各明細が2人に対応し、結果は3×2=6行です。元の売上が9,000円なら、そのまま合計すると18,000円になります。

確認箇所見る内容対処の方向
結合前の元明細明細IDごとの行数と金額正しい元データを確定する
結合条件IDだけで足りるか、年月なども必要か業務上のキーで結ぶ
結合先同じキーが何行あるかマスターの一意性を確認する
結合後同じ明細IDが増えていないか増えた段階を特定する

二つの明細テーブルを同じ得意先IDだけで結ぶ場合も要注意です。売上3行と入金2行なら6行に増えるため、双方を得意先別などの必要な単位に集計してから、そのキー同士で結合します。ただし、集計後でも相手側のキーが重複していれば行は増えます。

担当者別に売上を分配したいなら、主担当者を一人に決める、配賦率を持たせるなどの業務ルールが必要です。DISTINCTで結果だけを消すと、本来残すべき同額の別明細まで見落とすおそれがあり、根本的な対策にならない場合があります。

結合前の集計単位と結合先キーの一意性を確認し、結合後の明細件数と総額を照合して二重計上を防ぐ三つの確認

件数と総額を同じ条件で確認する

検算は、同じ期間・対象・税区分・取消条件に揃えて行います。元明細の全体合計と、各グループの合計を再度足した値を比較し、さらに特定の得意先1件を明細から手計算します。総額だけの一致では、得意先間の振り分け間違いを見落とすためです。

教材では次の期待値を確認できます。集計結果を変更したら、変更対象だけでなく元の得意先別売上も再確認し、共有クエリを編集した影響がないか見てください。

確認項目教材の期待値
元明細件数5行
全期間の売上合計13,000円
得意先別売上A 10,000円、B 3,000円
明細件数と伝票件数5件と4件
2026年1月の売上合計8,000円
2026年1月かつ合計4,000円以上A 5,000円のみ
年月別の合計2025年1月 1,000円、2026年1月 8,000円、2月 4,000円

全体件数と総額を同時に確認するクエリは次のとおりです。結合前後の比較にも同じ考え方を使えます。ただし、集計後の行数はグループ数なので、元明細の行数と直接一致させるものではありません。

SELECT Count(*) AS [明細件数],
       Sum([明細金額]) AS [売上総額]
FROM [Q_売上明細金額];

対象期間と条件、元明細の件数と総額、Nullと重複、代表一件の手計算を確認する集計結果の検算チェックリスト

集計できないときの原因と対処

症状主な確認先対処
明細のまま行数が減らないグループ化した列明細IDなど不要な列を外す
合計が使えない、型のエラー数量と金額のデータ型文字列の混入や取込設定を確認する
集計関数に含まれていないというエラーSELECTの各列集計するかGROUP BYに含めるかを決める
パラメーター入力が突然出るフィールド名、元クエリ名表記や参照先の変更を確認する
件数が予想より少ないCountの対象、Null、内部結合何を1件とするかを確認する
売上が倍になる結合先の重複キー結合前後の明細IDを追う
特定月が表示されない月の元明細の有無月一覧との外部結合を検討する
集計結果を編集できない集計クエリの用途更新は元明細を扱うフォームなどで行う

設計視点として重視したいのは、集計式だけでなく「集計対象」「1行の単位」「結合のキー」を説明できる状態にすることです。クエリ名や仕様メモに対象期間・金額定義・件数の意味を残すと、担当者が変わっても数値の根拠を確認しやすくなります。


7 よくある質問

本記事の選択・集計クエリを実行しても、元テーブルの値は変更されません。ただし、既存クエリの設計変更は、そのクエリを参照する帳票や画面に影響します。まずコピーや別名保存で試してください。

できます。得意先IDで集計したクエリに、一意の得意先IDを持つマスターを結合して名称を表示する方法があります。マスターに同じIDが複数ないこと、対応のないIDが落ちていないことも確認します。

使えます。指定した項目の組み合わせごとにまとめることができます。合計や件数も必要なら、対象列にSumやCountを追加します。明細IDを一緒に含めると、明細ごとに分かれる点に注意してください。

1枚の伝票に複数明細があると、その行数を数えるためです。伝票を一意に識別するキーだけの一覧を先に作り、その一覧をCountしてください。

使えます。保存した集計クエリを再利用し、期間条件だけを変更するか、日付/時刻型のパラメーターやフォームの期間入力を使う構成にします。教材の固定日付のままでは期間は自動で切り替わりません。

Runtimeは既存アプリケーションを実行するための環境で、通常のデザイン操作によるクエリ作成・変更にはAccess製品版を使います。Runtimeで利用者に期間を指定してもらうなら、あらかじめ期間入力と実行用の画面を用意します。[9]

表名・列名・型が教材と同じなら試しやすい例ですが、業務の金額定義や欠損値、返品処理まで保証するものではありません。本記事はAccess実機での動作検証を未実施のため、対象環境で期待結果と照合してから適用してください。

集計クエリと数値不一致の改善で困ったときは

まずは、得意先を1件、期間を1か月などに絞り、元明細と結果を比較してください。それでも原因が追えない場合や、複数の帳票・取込処理・共有クエリが絡む場合は、影響範囲を整理して調査する必要があります。

相談時には「対象の帳票・クエリ」「期間と抽出条件」「現在の金額と期待する金額」「個人情報や機密を除いた再現例」を用意すると、集計式・データ・結合のどこを確認すべきか共有しやすくなります。

Accessの教科書では、集計クエリの作成や数値不一致の改善について相談するための窓口をご案内しています。


参考情報

[1] Microsoft Support「クエリを使用してデータを集計する」
https://support.microsoft.com/ja-jp/access/sum-data-by-using-a-query

[2] Microsoft Learn「GROUP BY clause Microsoft Access SQL」
https://learn.microsoft.com/en-us/office/vba/access/concepts/structured-query-language/group-by-clause-microsoft-access-sql

[3] Microsoft Learn「HAVING clause Microsoft Access SQL」
https://learn.microsoft.com/en-us/office/vba/access/concepts/structured-query-language/having-clause-microsoft-access-sql

[4] Microsoft Learn「Count function Microsoft Access SQL」
https://learn.microsoft.com/en-us/office/vba/access/concepts/criteria-expressions/count-function-microsoft-access-sql

[5] Microsoft Learn「Sum function Microsoft Access SQL」
https://learn.microsoft.com/en-us/office/vba/access/concepts/criteria-expressions/sum-function-microsoft-access-sql

[6] Microsoft Learn「Avg function Microsoft Access SQL」
https://learn.microsoft.com/en-us/office/vba/access/concepts/criteria-expressions/avg-function-microsoft-access-sql

[7] Microsoft Learn「Application.Nz method Access」
Application.Nz method (Access) | Microsoft Learn

[8] Microsoft Learn「DateSerial function」
https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dateserial-function

[9] Microsoft Support「Deploy an Access application」
https://support.microsoft.com/en-us/access/deploy-an-access-application

関連記事

Accessのクエリとは?種類・抽出条件・作り方を解説|Accessの教科書

Accessのテーブルとは?作り方・フィールド・主キーを解説|Accessの教科書

Accessのレポートとは?作り方・印刷・集計・PDF出力を初心者向けに解説

Accessデータベースの基礎|データベース基礎を初心者向けに解説

TOP