Accessでクロス集計クエリを使うと、集計結果が見やすくなる反面、列の順番が変わったり、月が抜けたりして困った経験はありませんか?なかぜんです。今回は、そんな「列が動く問題」をスッキリ解決する方法を3つに絞って、やさしく解説していきます!
なぜ列が変わるの?クロス集計の基本
クロス集計クエリは、縦方向のデータを横展開(ピボット)して表示するものです。しかし、データに存在する値に応じて列が生成されるため、「ある月のデータがなければその列が表示されない」といった動的な挙動が発生します。これが原因で、帳票の列順が変わったり、表示がおかしくなることがあります。
列を固定する3つの方法
方法1:列見出しプロパティを使って手動で固定
デザインビューでクロス集計クエリを開き、「列見出し」プロパティに下記のように指定します:
"1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"
これで、どの月にデータがなくても、全ての月が列として表示されるようになります。
方法2:SQLでPIVOT IN句を使う
SQLビューに切り替えて、PIVOT句に明示的に列を指定することで、列を固定できます。例えば:
TRANSFORM Nz(Sum(s.売上金額),0) AS 合計金額
SELECT p.商品名
FROM 商品マスタ AS p
LEFT JOIN 売上データ AS s ON p.商品ID = s.商品ID
GROUP BY p.商品名
PIVOT s.売上月 IN ("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月");
このIN句で、列の順番と表示を固定しています。「Nz(…)」関数でNULLを0に変換しているのもポイントです。
方法3:補助テーブルで全パターンを用意する
たとえば「月マスタ」テーブル(1〜12月)を作り、売上データとLEFT JOINします。これにより、売上がなかった月でも0として表示されるようになります。実装の一例:
SELECT 月マスタ.月名, Nz(Sum(売上.金額),0) AS 月別売上
FROM 月マスタ
LEFT JOIN 売上 ON 月マスタ.月番号 = 売上.月
GROUP BY 月マスタ.月名;
この結果をクロス集計の元データとして使えば、安定した出力が可能になります。
よくあるミスと注意点
- 列見出しの書式ミス(ダブルクォートやカンマ抜け)
- IN句の値と実データの型が一致しない
- 補助テーブルに月が不足している
- NULLが空白になるのでNz関数でゼロ補完が必要
応用テクニック
列の日本語化と見やすい表示
IN句に”1月”などの文字列を使えば、列見出しがわかりやすくなります。報告書向けにおすすめです。
フォームやレポートとの連携
列が固定されることで、フォームやレポートとの連携がしやすくなり、見た目のズレも防げます。安定したUI設計が可能になります。
まとめ
Accessのクロス集計クエリで列を固定するには:
- 列見出しプロパティで明示的に指定
- SQLのIN句で順序と列を制御
- 補助テーブルを用いたLEFT JOINで列を保証
これらを使いこなせば、データに依存しない安定した帳票・クエリ設計が可能になります。まずは一番シンプルな方法から試してみましょう。なかぜんでした!