Access クロス集計クエリで列の並び順を固定する方法

概要

この記事の結論
Accessのクロス集計クエリは、クエリのプロパティにある列見出しへ値を並べると、列の順番と表示対象を固定できます。SQLではPIVOTのIN句に相当します。月別帳票ではデータのない月も列として用意できますが、指定外の分類は表示されません。この記事では月順と年度順の設定、型の合わせ方、空欄の扱い、集計漏れを防ぐ確認方法まで説明します。

この記事でわかること

  • 列の固定で変わることを理解する
  • クエリ列見出しで表示順を設定する
  • SQLのPIVOT IN句で同じ設定をする
  • 月順と4月始まりの年度順に並べる
  • データのない列と表示されない分類を扱う

この記事の主な内容

  1. 列の固定で変わることを理解する
  2. クエリ列見出しで表示順を設定する
  3. SQLのPIVOT IN句で同じ設定をする
  4. 月順と4月始まりの年度順に並べる
  5. データのない列と表示されない分類を扱う
  6. 帳票とCSVを安定させる確認方法
  7. よくある質問

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


列の固定で変わることを理解する

クロス集計クエリの列順を固定するには、クエリ自体のプロパティで[列見出し]を設定します。日本語の画面では[クエリ列見出し]と表示される場合もあります。表示したい値を希望の順番で並べると、その順に列が作られます。SQLビューではPIVOTのIN句に対応する設定です。

列固定には「順番を決める」「表示する列を限定する」「データがなくても指定列を用意する」という役割があります。順番だけを変えたつもりでも、指定していない商品や分類が結果から見えなくなる点に注意してください。元のレコードが削除されるわけではありません。

行の並べ替えとは設定する場所が違う

商品が縦に並び、月が横に並ぶ表を考えます。商品の表示順を変えるのは行の並べ替え、1月から12月の順を決めるのは列の設定です。行を商品名順にしても、月の列順が希望どおりになるとは限りません。最初に、変えたいのが行か列かを確認しましょう。

例えば「東日本、西日本、本社」のような業務上の順番は、文字列の昇順では表せません。月名が「1月、10月、11月、2月」のように見える場合も、文字として並んでいる可能性があります。意味のある業務順を保つには、列を明示する方法が向いています。

Accessで行の順番と列の順番を説明する図解

クエリ列見出しで表示順を設定する

ここでは、列見出しが[地域]、行見出しが[商品]、値が[売上金額]の合計になっているクロス集計を例にします。表示する地域を「東日本、西日本、本社」の順に固定します。既存のクエリは先にコピーしておくと、変更前と比較できます。

1. 対象のクロス集計クエリを右クリックし、[デザインビュー]で開きます。

2. [プロパティシート]を表示します。F4でも表示できます。

3. 上部のテーブル表示領域の何もない場所をクリックし、クエリ全体のプロパティを選びます。

4. [列見出し]または[クエリ列見出し]に、次の値を半角記号で入力します。

5. 保存してデータシートビューを開き、表示順と列数を確認します。

“東日本”,”西日本”,”本社”

フィールドのプロパティを選んでいると、目的の項目が見つからないことがあります。列見出しに使うフィールドの[並べ替え]欄ではなく、クエリ全体のプロパティを確認するのがポイントです。プロパティを変更した後はSQLビューも見ると、設定内容を確かめられます。

Accessで列見出しを固定する手順を説明する図解

表示名ではなく実際の値を指定する

列見出しの元が地域コードなら、見た目の地域名ではなく元データに対応したコードを指定します。例えば数値1・2・3を使うフィールドに「東日本、西日本、本社」を入れても一致しません。ルックアップで名称を見せている場合は、保存されている値を確認してください。

列見出しの元指定する例確認すること
文字列の地域名“東日本”,”西日本”,”本社”表記が元データと一致しているか
数値の月番号1,2,3,4引用符を付けず数値として指定
文字列の月名“1月”,”2月”,”3月”「01月」など別の表記と混ざっていないか
文字列のコード“001”,”002″,”003″先頭0を含めたコードが一致するか

入力後に全列が空欄になった場合は、データが消えたと判断する前に、値と型を確認します。元クエリで列見出しの値を一覧にし、固定したい値と照合すると原因を見つけやすくなります。表記揺れを直す際は、入力元やマスターの修正も検討します。

Accessで見出しの値と型をそろえるを説明する図解

SQLのPIVOT IN句で同じ設定をする

SQLで列を固定する場合は、PIVOTの末尾にIN句を追加します。次の例は「T_売上」の[商品]を縦、[地域]を横に置き、[売上金額]を合計します。テーブル名とフィールド名は説明用です。角括弧の中を実際の名前に合わせてください。

TRANSFORM Sum([売上金額]) AS [金額合計]
SELECT [商品]
FROM [T_売上]
GROUP BY [商品]
PIVOT [地域] IN (“東日本”,”西日本”,”本社”);

TRANSFORMは集計方法、SELECTとGROUP BYは行のまとめ方、PIVOTは列へ広げる値を指定しています。INの中に並べた値が、表示対象と表示順になります。最後のセミコロンをIN句より前に置くとSQLが途中で終わるため、句の位置にも注意します。

小さな例で固定の影響を確かめる

商品Aに東日本100、西日本200、海外50という売上があるとします。列を「東日本、西日本、本社」に固定すると、東日本100、西日本200が表示され、本社は空欄になります。海外の売上50は、元データにあっても海外列としては表示されません。

このとき、画面に見える列を足すと300、元データ全体の売上は350です。列固定は元データ全体を削るWHERE条件とは別の指定なので、別に設けた行合計と見える列の合計が一致しない場合もあります。合計に何を含めるかを先に決めましょう。

AccessでPIVOT INと列の対応を説明する図解

月順と4月始まりの年度順に並べる

月別の集計は、月番号を使うと順序を明確にできます。ただし、Month関数が返す1~12だけでは年を区別できません。2025年1月と2026年1月を同じ表へ混ぜないよう、集計期間も同時に指定します。列順と対象期間は別々に設定する必要があります。

暦年の12か月を並べる例

2026年1月から12月を集計する場合、次のように期間を絞ります。終了条件を翌年1月1日未満にしているため、売上日に時刻が含まれていても12月31日の夜まで対象にできます。日付型の[売上日]と通貨型などの[売上金額]を前提とします。

TRANSFORM Sum([売上金額]) AS [金額合計]
SELECT [商品]
FROM [T_売上]
WHERE [売上日] >= DateSerial(2026,1,1)
  AND [売上日] < DateSerial(2027,1,1)
GROUP BY [商品]
PIVOT Month([売上日])
  IN (1,2,3,4,5,6,7,8,9,10,11,12);

4月始まりの年度は期間も4月からにする

2026年度を「2026年4月1日以上、2027年4月1日未満」と定義するなら、WHEREの開始日をDateSerial(2026,4,1)、終了日をDateSerial(2027,4,1)へ変えます。IN句は次の順番です。これで左から4月、5月、最後が翌年3月になります。

PIVOT Month([売上日])
  IN (4,5,6,7,8,9,10,11,12,1,2,3);

IN句だけを4月始まりに変更しても、年度の範囲は変わりません。暦年の条件のままなら、最後に表示される1~3月は同じ2026年の値になります。帳票の見出しには「2026年度」の定義を表示し、4月1日と翌年3月31日のデータを使って確認しましょう。

Accessで4月始まりの年度を設定するを説明する図解

月次集計と列固定の見直しで迷ったときは

まずは記事の手順で対象と結果を確認しましょう。既存の処理との関係が分からない、変更の影響を判断できない場合は、現在のテーブル・クエリ構成と困っている点を整理して、Accessの教科書へご相談ください。


データのない列と表示されない分類を扱う

固定した列は、該当データがなくても用意できます。ただし、列の中の値は空欄になることがあります。また、売上が一件もない商品の行まで自動で増えるわけではありません。「月の列があること」と「全商品の行があること」は別の要件です。

Nullを0にする範囲を決める

空欄が「売上なし」を表し、業務上0として扱ってよいなら、表示用の選択クエリなどでNz([1],0)のように変換します。例えば固定した1月のフィールド[1]を[1月売上]という別名で取り出せます。変換は列を固定してから行うと、存在しない列を参照する問題を避けやすくなります。

SELECT [商品],
       Nz([1],0) AS [1月売上],
       Nz([2],0) AS [2月売上]
FROM [Q_月別クロス];

ここでは説明を短くするため2列だけを示しています。12か月を出力する場合は3~12も同じ形で追加します。Nullは未入力や不明を表す場合もあるため、金額が未登録の明細まで無条件に0へ変換すると、データ不備が見えなくなることがあります。

全商品を表示したい場合は、商品マスターを基準に、集計結果と外部結合する方法を検討します。元データにない行は、Nzを使うだけでは作れません。全支店、全担当者、全月を並べる帳票でも、基準となるマスターや期間一覧が必要かを確認します。

Accessで空の列と空の行の違いを説明する図解

指定外の分類を見つける

固定列に含めなかった地域を調べるなら、次のような確認用クエリを用意できます。Is Nullも条件に含めて、地域未入力のレコードを見落とさないようにします。売上を期間で絞っている場合は、この確認用クエリにも同じ期間条件を加えて比較します。

SELECT [地域], Count(*) AS [件数],
       Sum([売上金額]) AS [金額合計]
FROM [T_売上]
WHERE [地域] Not In (“東日本”,”西日本”,”本社”)
   OR [地域] Is Null
GROUP BY [地域];

表示された分類が意図した除外なのか、新しく追加された分類なのかを確認します。新分類があったら固定リストへ追加する、その他へまとめる、別帳票へ出すなど、運用ルールを決めます。「今月は新しい列がないから問題なし」と判断しないことが大切です。

Accessで指定外の分類を見つけるを説明する図解

帳票とCSVを安定させる確認方法

列を固定すると、レポートやCSVの構造をそろえやすくなります。ただし、レポートのラベルと参照フィールド、CSVを受け取る側の列定義も一緒に確認します。表示順を変更しただけで、後続処理の参照先まで正しく切り替わるとは限りません。

確認項目確認するサンプル期待する状態
順番全分類に値がある指定した順で並ぶ
欠落列一部の月に売上がない列は残り、空欄か0の方針どおりになる
指定外新しい地域を追加する確認用クエリで検出できる
年度4月1日と翌年3月31日を含める年度範囲に入り、翌4月1日は除外される
合計元明細と表示列を照合する除外分を含めて差額の理由を説明できる

列が増え続けるなら形式も見直す

月や固定の区分には列固定が向きます。一方、商品コードが毎月増える表では、固定リストの保守が負担になる場合があります。その場合は商品を行へ置き換える、カテゴリ別に分ける、Excelのピボットテーブルで分析するなど、利用目的に合う出力方法を検討します。

毎回SQLを手修正する運用にするなら、変更箇所・対象年度・確認結果を記録します。担当者が交代しても、なぜその列だけを出しているか分かるようにすることが重要です。列固定の設定だけでなく、入力分類の追加時に誰が見直すかまで決めておきましょう。

Accessで列固定後の確認チェックを説明する図解

まとめ

クロス集計の列順は、列見出しのプロパティまたはPIVOT IN句で固定できます。表示対象も同時に限定されるため、指定外の分類やNull、集計期間を確認してください。月次帳票では、列順・対象年度・合計の範囲を一組として管理すると、見やすさと集計の正確性を両立できます。


よくある質問

単純な数値順や文字順でよい場合は、並べ替えで目的を満たせることもあります。ただし「東日本、西日本、本社」のような業務順や、データのない月も含む固定列には、列見出しの明示が適しています。また、行の並べ替えと列の並び順は別です。どの方向を変えたいかを確認してください。固定リストを設定した後は、指定していない分類が表示対象から外れるため、順番だけでなく列の漏れと合計も確認する必要があります。

列見出しに1~12などを固定すれば、売上がない月の列も用意できます。ただし、値は空欄になることがあり、0表示にするならNzなどで表示用の処理を加えます。また、売上が一件もない商品の行までは自動で作られません。全商品を表示する必要があるときは、商品マスターと集計結果の外部結合などを検討します。月の列を残すこと、商品の行を残すこと、空欄を0にすることを分けて設計すると整理しやすくなります。

月を「1月」「10月」のような文字列にしていると、文字の順番で並ぶためです。Monthで得た数値1~12を列見出しにして固定するか、文字列の月名を希望の順で明示すると対応できます。PIVOTの式が数値を返すならIN句も数値、文字列を返すなら引用符付きの文字列にそろえます。見た目だけを合わせても型や表記が異なると空欄になるため、元の列見出しがどの値を返しているかを確認してください。

できます。月番号を列に使い、IN句を4,5,6,7,8,9,10,11,12,1,2,3の順にします。さらに、WHERE条件を対象年度の4月1日以上、翌年4月1日未満に設定してください。列順だけを変えても抽出期間は変わらず、別の年の1~3月が入る可能性があります。例えば2026年度なら2026年4月から2027年3月であることを帳票へ明記し、境界日のレコードを使って確認すると誤りに気づきやすくなります。

商品を列見出しにしている場合は、固定した一覧にその商品の値が含まれているか確認してください。指定外の値は列として表示されません。名前を変更した商品、コードの型が違う商品、未入力値なども見落としやすい箇所です。まず固定前のクエリや分類一覧と比べ、消えた分類を特定します。商品を行にしている場合は、抽出条件や結合が原因の可能性もあるため、列固定だけを原因と決めつけず元明細までたどって確認しましょう。

空欄が「その期間に取引がない」という意味なら、帳票上で0表示にすることはできます。一方、単価や金額が未入力で集計できなかった場合まで0にすると、データ不備を見逃します。Nullが生じた理由を確認し、未入力チェックと表示上の変換を分けてください。列固定後の表示用クエリでNz([1],0)などを使えば、元データを変更せずに0表示へ整えられます。ただし、存在しない商品行そのものをNzで増やすことはできません。

1~12の月番号を固定列にするなら、列名を毎年変えず、期間条件だけを変更する構成にできます。帳票のラベルは1月~12月などとし、対象年や年度をタイトルへ表示します。一方、「2026年04月」のような年月文字列を列名にすると、翌年度は固定リストやレポートの参照先の更新が必要です。単年度の定型帳票か、複数年を横に比較する表かによって選びましょう。期間をパラメーター化する場合は、日付型の宣言と入力値の確認も行います。

関連記事

Accessクエリでグループ化して集計

Accessパラメータクエリの作り方

Accessクエリでテーブルを結合する方法

月次集計と列固定の見直しで迷ったときは

まずは記事の手順で対象と結果を確認しましょう。既存の処理との関係が分からない、変更の影響を判断できない場合は、現在のテーブル・クエリ構成と困っている点を整理して、Accessの教科書へご相談ください。


参考情報

クロス集計クエリの作成と列見出し
https://support.microsoft.com/ja-jp/access/make-summary-data-easier-to-read-by-using-a-crosstab-query

TRANSFORMステートメント
https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/transform-statement-microsoft-access-sql

クロス集計をレポートで使う
https://www.microsoft.com/en-us/microsoft-365/blog/2012/05/23/using-crosstab-queries-in-reports

TOP