スポンサーリンク

クロス集計クエリで列を固定する方法

スポンサーリンク
Access
スポンサーリンク

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で列を保証

これらを使いこなせば、データに依存しない安定した帳票・クエリ設計が可能になります。まずは一番シンプルな方法から試してみましょう。なかぜんでした!