Accessのユニオンクエリについてお探しですね。

広告

Accessで複数のテーブルを縦につなげる「ユニオンクエリ」の使い方

Accessでデータベースを使っていると、「毎月別々に作っているテーブルをまとめて見たい」とか「各支店のデータを一箇所に集めて分析したい」って思うこと、ありますよね。

でも、いつものクエリ作成画面でテーブルを並べても、データは横につながるだけで、縦には積み重なってくれません。

実は、Accessには複数のテーブルを縦に積み上げて一つにまとめる「ユニオンクエリ」という便利な機能があるんです。

ただこの機能、メニューやウィザードには出てこないので、知らない人も多いかもしれません。

この記事では、SQLがよくわからない人でも迷わず使えるように、ユニオンクエリの作り方と実際の仕事で役立つコツを、できるだけわかりやすく説明していきます。

ユニオンクエリって何?普通のクエリとどう違うの?

Accessの「ユニオンクエリ(UNION Query)」というのは、複数のテーブルやクエリの結果を縦方向につなげて、一つのまとまったデータとして扱うための特別なクエリです。

普通の「選択クエリ」とか、リレーションシップを使ってテーブルをつなぐ「結合(JOIN)」は、関連するデータを横方向につなげる作業です。

例えば、「売上テーブル」に「商品マスタ」をくっつけて商品名を表示させる、みたいな使い方ですね。

それに対してユニオンクエリは、Excelで例えるなら「4月の売上シート」の下に「5月の売上シート」のデータをコピペして、縦に長い一つの表を作る作業を自動でやってくれるイメージです。

なんでこれが「裏技」みたいに言われるかというと、Accessの普通の操作画面(クエリデザインビュー)では作れないからなんです。

クエリ作成ウィザードを探しても「ユニオンクエリ」なんて項目は見当たりません。

このクエリを作るには、「SQLビュー」という画面を直接開いて、命令文(SQL)をキーボードで打ち込む必要があります。

そのため初心者には難しそうに見えますが、基本の書き方さえ覚えてしまえば、実はそんなに難しくありません。

むしろ、一度作っておけばデータが増えても自動的にまとめてくれるので、毎月の集計作業がものすごく楽になる強力な武器になりますよ。

あと、ユニオンクエリには「UNION」と「UNION ALL」の2種類があります。

単に「UNION」と書くと、Accessはデータをつなげるときに中身をチェックして、まったく同じ行があったら削除して1行にまとめようとします。

一方「UNION ALL」と書くと、重複チェックはせずに全部のデータをそのまま表示します。

実際の仕事で、違う月の売上データなんかをつなげる場合、たまたま同じ金額や内容の取引があっても、それは別々の取引として扱うべきですよね。

それに、重複チェックの処理はパソコンに負担がかかって動作が遅くなる原因にもなります。

特別な理由がない限り、Accessでは速く動く「UNION ALL」を使うのが一般的で、おすすめの書き方です。

【実際にやってみよう】Accessでユニオンクエリを作る手順

それでは実際に、Accessでユニオンクエリを作る手順を説明していきますね。

ここでは例として、「T_4月売上」と「T_5月売上」という、まったく同じ構造の2つのテーブルを縦につなげるケースで進めます。

まず最初に、「作成」タブから「クエリデザイン」をクリックして、新しいクエリの作成画面を開きます。

普通ならここで「テーブルの表示」というダイアログが出てきてテーブルを選ぶんですが、ユニオンクエリの場合はテーブルを追加しなくて大丈夫です。

ダイアログは閉じちゃって、空っぽのクエリ作成画面が表示されている状態にしてください。

次に、画面の表示モードを「デザインビュー」から「SQLビュー」に切り替えます。

ここがユニオンクエリ作成の一番のポイントです。

画面左上の「表示」ボタンの下にある矢印をクリックするか、タブを右クリックして「SQLビュー」を選んでください。

すると、画面が白いメモ帳みたいな状態になって、最初から「SELECT;」という文字が入っている場合がありますが、これは消しちゃって構いません。

この真っ白な画面に、直接SQL文を書いていきます。

基本の形はとてもシンプルで、「1つ目のテーブルから全データを取ってくる命令」と「2つ目のテーブルから全データを取ってくる命令」を、「UNION ALL」という接着剤でくっつけるだけです。

具体的には、こんな感じで書きます。

“`sql
SELECT * FROM T_4月売上
UNION ALL
SELECT * FROM T_5月売上;
“`

こう書いたら、一度「実行」ボタン(赤いビックリマークのアイコン)を押して結果を確認してみましょう。

2つのテーブルのデータが縦につながって表示されていたら成功です!

もしテーブルが3つ以上ある場合も、同じように「UNION ALL」でつないでいくだけでOKです。

SQLを書くのに抵抗がある人でも、この「SELECT * FROM テーブル名」の形さえ覚えておけば、あとはテーブル名を変えるだけで対応できるので、実はすごく便利なテクニックなんですよ。

完成したらクエリに名前を付けて保存しますが、このときナビゲーションウィンドウ上のアイコンが、普通のクエリとは違う「2つの輪が重なったようなマーク」に変わります。

これもユニオンクエリの特徴ですね。

エラーを防ぐために守るべき「3つのルール」と対処法

ユニオンクエリは便利なんですが、作るときによくエラーが出るポイントがいくつかあります。

エラーメッセージが表示されて動かないときは、つなごうとしているテーブル同士の整合性が取れていないことがほとんどです。

ユニオンクエリをうまく作るには、守らなきゃいけない「3つのルール」があります。

これを無視すると、「クエリの入力値が正しくありません」とか「フィールドの数が一致しません」なんてエラーが出て、データが表示されません。

ルール1:フィールド(列)の数を合わせる

まず1つ目は、「フィールド(列)の数を合わせること」です。

例えば、つなげたいテーブルAには「ID、日付、商品名、金額」の4列があるのに、テーブルBには「ID、日付、金額」の3列しかない場合、Accessはどの列同士をくっつければいいか判断できなくてエラーになります。

もし片方のテーブルにしかない項目がある場合は、少ない方のテーブルのSQL文にダミーの列を追加して数を合わせるなどの工夫が必要です。

また、ワイルドカード(*)を使って「SELECT *」と書く場合は、テーブル設計の段階で列数が完全に一致している必要があります。

ルール2:フィールドのデータ型を合わせる

2つ目は、「フィールドのデータ型を合わせること」です。

1列目は数値型、2列目はテキスト型、というように、つなげる列同士のデータ型が一致していないとダメです。

例えば、テーブルAの「会員ID」は数値型で保存されているのに、テーブルBの「会員ID」がテキスト型になっていると、つなげるときにエラーが出たり、変な表示になったりする可能性があります。

特にExcelからインポートしたデータなんかは、見た目は数字でもテキスト型として認識されていることがあるので注意してください。

ルール3:フィールドの並び順を揃える

3つ目は、「フィールドの並び順を揃えること」です。

ユニオンクエリは、単純に左から順番に1列目、2列目…とデータを積み上げていきます。

もしテーブルAが「日付、名前」の順で、テーブルBが「名前、日付」の順になっていても、Accessはデータの中身までは見ずに、そのままつなげちゃいます。

その結果、「日付」の列に「名前」が混ざってしまうというデータの崩壊が起きます。

「SELECT *」を使うとテーブル定義の並び順に頼ることになるので、トラブルを避けるには、「SELECT ID, 売上日, 金額 FROM…」みたいに、具体的なフィールド名を書いて順序を固定するほうが安全で確実です。

実際の仕事で役立つ!データの出どころを見分けるテクニック

複数のテーブルを縦につなげられたとしても、そのままだと「どの行がどのテーブルから来たデータなのか」がわからなくなっちゃうという問題が起きます。

例えば、4月と5月のデータをつなげた後で、「4月だけの合計を出したい」と思っても、元の日付データが入ってなければ区別がつきません。

あるいは、支店ごとのテーブルをつなげた場合、どの支店の売上なのか見分けがつかなくなっては分析の意味がないですよね。

そこで実際の仕事では、SQLの中に「固定の文字列」を新しい列として追加するテクニックがよく使われます。

具体的には、SQLのSELECT文の中に、文字列を直接書いて新しいフィールドを作ります。

例えば、「T_4月売上」のデータを取ってくる部分をこんな風に書き換えます。

“`sql
SELECT “4月分” AS 対象月, * FROM T_4月売上
“`

こう書くと、元のテーブルにはない「対象月」という名前のフィールドが仮想的に作られて、そこには全部「4月分」という文字が入ります。

同じように2つ目のSELECT文にも `”5月分” AS 対象月` と書いてつなげれば、完成したユニオンクエリには「対象月」という列ができて、データの出どころが一目でわかるようになります。

このテクニックを使えば、テーブル自体に「月」や「支店名」といった情報が入ってなくても、つなげた後のクエリで自由にグルーピングや集計ができるようになりますよ。

最後に、データの並び替え(ソート)についてです。

ユニオンクエリでは、個々のSELECT文に「ORDER BY」をつけて並び替えを行うことはできません。

並び替えをしたい場合は、全部のUNIONをつなぎ終わった一番最後に、一度だけ「ORDER BY」句を書きます。

これで、つなげられた全体のデータに対して並び替えが適用されます。

この「固定列の追加」と「最後の並び替え」をマスターすれば、Accessでのデータ加工の自由度はグッと上がって、複雑なExcel作業をAccessだけで終わらせることができるようになります。

ぜひ試してみてくださいね!

広告