2019年02月24日
Accessクエリ,ユニオンクエリ
ノートパソコンのことならパソコン工房通販ショップ



マイクロソフトエクセルのまとめ記事はこちら

Microsoft Office ブログランキングへ
【ユニオンクエリ】
ユニオンクエリはクエリの中でも比較的作成が難しいですね。
通常クエリを作成する場合は「クエリウィザード」か「クエリデザイン」
から作成すれば、ほぼ自動的に作成できますね。
しかしユニオンクエリはSQLビューで記述していく必要があります。
SQLビューというのはどのようなものか例を表示します。
以前使用した「切手在庫管理」で「Q_在庫数」というクエリがあります。

このようなものでしたね。
これを「SQLビュー」にします。

「表示」の部分で「SQLビュー」を選択します。
すると画面が右のような画面になりましたね。これがSQLです。
このようなものを自分で記述していく必要があります。
「SELECT Q_全入庫.種類, Q_全入庫.入庫数の合計, Q_全出庫.出庫数の合計,
[入庫数の合計]-[出庫数の合計] AS 在庫数
FROM Q_全入庫 INNER JOIN Q_全出庫 ON Q_全入庫.
種類 = Q_全出庫.種類
GROUP BY Q_全入庫.種類, Q_全入庫.入庫数の合計,
Q_全出庫.出庫数の合計,
[入庫数の合計]-[出庫数の合計];」ここに書かれている内容は
この通りです。
内容に関して、今は説明しません。
ユニオンクエリを説明している中で理解できてくると思います。


どのような時にユニオンクエリを使用するのか?

例えばExcelファイルで上のように2016年度と2017年度で別ファイルが
あったとします。
これを結合するのは簡単ですね。
どちらかのデータを行コピーして別のファイルに張り付ければOKです。

ここでAccessの場合はどうか考えてみましょう。
Accessで「T_2016入出庫」と「T_2017入出庫」の二つのテーブルが
あった場合どうすれば結合できるか考えてください。

クエリデザインで上記のようにしたとして、ここからどうしますか?
両方のテーブルから各項目を選択したとして、横に並ぶだけですね。
縦には結合できないですね。
このような時に「ユニオンクエリ」を使用します。
【国認定】不用PCの宅配便回収<リネットジャパン>

「ユニオンクエリの作り方」
まず、クエリデザインを選択します。
「テーブルの表示」が出ますが、「閉じて」ください。

リボンの「SQL表示」か「ユニオン」ボタンかどちらかを押してください。
若干表示内容が違います。SQL表示を押した場合で作成していきましょう。
「SQL表示」を押してください。

上記のように「SELECT;」という内容になりますね。
この「SELECT」と「;」の間に記述していきます。
この「SELECT」と「;」は既定です。
先ほどのリボンのボタンで「ユニオン」を押した場合、
このこの「SELECT」と「;」は記述されていません。
白紙の状態でスタートします。
最初に複数テーブルを結合する場合の条件を考える必要があります。
各テーブルのフィールド名とフィールド数が同じ場合。
この場合は「追加クエリ」を使用することもできると思います。
また各テーブルのフィールド名とフィールド数が違う場合。
この場合はユニオンクエリでしか結合できません。
基本のユニオン
2つの同じフィールドのテーブルを結合する場合。
SELECT * FROMテーブル1
UNION SELCT * FROMテーブル2;
上記のようになります。
もしテーブルが3つあれば同じようにして「テーブル3」を
追記すればOKです。

SELECT * FROM T_2016入出庫
UNION SELECT * FROM T_2017入出庫;
上記のように記述しました。
これで「通常表示」にしてみましょう。

上記のように2016年度と2017年度が結合されて表示されています。
ユニオンクエリはこのように使用します。
項目を指定して作成することもできます。
上記の中から「ID」と「購入先」と「出庫先」を省いてみましょう。

SELECT T_2016入出庫.日付,T_2016入出庫.種類,T_2016入出庫.入庫数,
T_2016入出庫.出庫数
FROM T_2016入出庫
UNION SELECT T_2017入出庫.日付,T_2017入出庫.種類,T_2017入出庫.
入庫数,T_2017入出庫.出庫数
FROM T_2017入出庫;
今度は少し記述内容が違いますね。
最初に表示したいフィールドを選択します。
「T_2016入出庫.日付,T_2016入出庫.種類,T_2016入出庫.入庫数,
T_2016入出庫.出庫数」の部分ですね。
「テーブル名.フィールド名」と記述して「,」で区切ります。
フィールド名が選択出来たら「FROM T_2016入出庫」で
どのテーブルから選択するのかを記述します。
その下の2017年度分は同じ内容ですね。
この状態で通常表示にします。

「ID」と「購入先」と「出庫先」が無くなっていますね。
そしてこの下に2017年度分が結合されています。
アメコミ映画を観るなら<U-NEXT>



次はフィール名を変更したい場合。
名前を変更したい場合というのは結構あります。
その場合はどうするのか。
例として「日付」を「日」だけに変更してみましょう。
SELECT T_2016入出庫.日付 AS 日,T_2016入出庫.種類,
T_2016入出庫.入庫数,T_2016入出庫.出庫数
FROM T_2016入出庫
UNION SELECT T_2017入出庫.日付 AS 日,T_2017入出庫.種類,
T_2017入出庫.入庫数,T_2017入出庫.出庫数
FROM T_2017入出庫;
上記のようにします。
「T_2016入出庫.日付 AS 日」とありますね。
これは日付という名前を日に変更する場合「元のフィールド名」+
「AS」+「新しいフィールド名」で変更できます。

上記のように日付が日になっていますね。
2つ以上のテーブルでたまたま名称が違うときとか、
名前を変更したい時などに便利です。


※ フィールド数が違う場合
たまにフィールド数が違うが結合させたいという時があります。
これもExcelなら簡単ですね。
例としてT_2016年入出庫の備考欄を削除します。
そのうえで結合したいと思います。
SELECT T_2016入出庫.ID,T_2016入出庫.日付,T_2016入出庫.種類,
T_2016入出庫.入庫数,T_2016入出庫.出庫数,T_2016入出庫.購入先,
T_2016入出庫.出庫先,NULL AS 備考
FROM T_2016入出庫
UNION SELECT T_2017入出庫.ID,T_2017入出庫.日付,T_2017入出庫.種類,
T_2017入出庫.入庫数,T_2017入出庫.出庫数,T_2017入出庫.購入先,
T_2017入出庫.出庫先,T_2017入出庫.備考
FROM T_2017入出庫;
上記のように記述します。
T_2016入出庫の最後の部分「T_2016入出庫.出庫先,NULL AS 備考」ですが、
「出庫先」の後に「NULL AS 備考」とあります。
ここがT_2016入出庫に無い部分なので「NULL」にします。
そしてその「NULLに「備考」というフィールド名を付けたということです。

上記のようになりました。
また抽出とかを行いたいときも可能です。
ユニオンクエリで2つのテーブルを結合して「82円」だけ抽出したいと
思います。
SELECT T_2016入出庫.ID,T_2016入出庫.日付,T_2016入出庫.種類,
T_2016入出庫.入庫数,T_2016入出庫.出庫数,T_2016入出庫.購入先,
T_2016入出庫.出庫先,NULL AS 備考
FROM T_2016入出庫
WHERE ((T_2016入出庫.種類)=82)
UNION
SELECT T_2017入出庫.ID,T_2017入出庫.日付,T_2017入出庫.種類,
T_2017入出庫.入庫数,T_2017入出庫.出庫数,T_2017入出庫.購入先,
T_2017入出庫.出庫先,T_2017入出庫.備考
FROM T_2017入出庫
WHERE ((T_2017入出庫.種類)=82);
抽出の場合はWHERE ((T_2017入出庫.種類)=82)のように「WHERE」を
使用します。

上記のように2つのテーブルが結合され、82円だけ抽出されました。
次に並べ替えを追加したいと思います。
上記のユニオンクエリに日付順の並べ替えを追記します。
SELECT T_2016入出庫.ID,T_2016入出庫.日付,T_2016入出庫.種類,
T_2016入出庫.入庫数,T_2016入出庫.出庫数,T_2016入出庫.購入先,
T_2016入出庫.出庫先,NULL AS 備考
FROM T_2016入出庫
WHERE ((T_2016入出庫.種類)=82)
UNION
SELECT T_2017入出庫.ID,T_2017入出庫.日付,T_2017入出庫.種類,
T_2017入出庫.入庫数,T_2017入出庫.出庫数,T_2017入出庫.購入先,
T_2017入出庫.出庫先,T_2017入出庫.備考
FROM T_2017入出庫
WHERE ((T_2017入出庫.種類)=82)
ORDER BY 日付;
最後に「ORDER BY 日付」を追記しました。
日付を並べ替えしなさいという記述です。

上記のように日付順に並びました。
他の選択クエリとかクロス集計クエリとかありますが、
すべて「SQLビュー」で確認できます。
SQLビューで書かれているような記述をすれば同じ結果がでます。
まあクエリウィザードとかクエリデザインでできるクエリはそちらを
使用しましょう。
どうしてもできない場合だけユニオンクエリを利用することにしましょう。
ユニオンクエリは是非覚えてください。
世界中8000万人が利用する話題のホテル検索サイト『トリバゴ』



【追加クエリ】
ユニオンクエリの途中で追加クエリという名前を出しました。
これもついでに紹介しておきましょう。
通常のクエリデザインから作成します。
条件として同じフィールド数で同じフィールド名ということで
作成いたします。
ユニオンクエリで使用したT_2016入出庫とT_2017入出庫を使用します。
今回はどちらも備考欄は省いています。
とりあえず
T_2017入出庫を選択してすべての項目を選択してください。

リボンの「追加」というボタンを押してください。
「追加」というボックスが出てきますので「テーブル名」で
T_2016入出庫を選択して「OK」を押してください。

レコードの追加という行が出てきますね。
一応「ID」はオートナンバー型なので赤丸部分は消しておきましょう。
そしてリボン左上にある「実行!」を押してください。
そして通常表示にしてください。

2017年の下に2016年のレコードが追加されていますね。
これが追加クエリです。
大体ここまででクエリについて紹介してきたつもりです。
Accessの心臓部はクエリです。
あらゆる加工について、ほぼクエリで実行できると思ってください。
クエリでの計算等もあまり紹介していませんが、様々な計算ができます。
例えば生年月日というフィールドがあり、クエリで「年齢」という
フィールドを追加します。
そこに「年齢: DateDiff("yyyy",[生年月日],Now())-1」という式を
挿入すると「年齢」が表示されます。
Access用の関数が用意されていますので、
その関数を使用して様々な計算ができます。
そのあたりは「何がしたいか」という明確なものがあればネットで
探せばいくらでも出てきます。
そうやって自分で勉強していけば実力がついてくると思います。


■□■━━━━━━━━━━━━━━━━━━━━━━━━
+++ 月額1,980円(1年間・税別)で使えるスマホ【UQmobile】 +++
https://px.a8.net/svt/ejp?a8mat=2TIIN2+9W1A2Q+2CPQ+1BQJAB
------------------------------------------------------
・番号そのままお乗換え可能!
・当サイト限定初期費用&送料無料!
・0円端末など豊富なラインナップ!
━━━━━━━━━━━━━━━━━━━━━━━━■□■


マイクロソフトエクセルのまとめ記事はこちら

Microsoft Office ブログランキングへ
【ユニオンクエリ】
ユニオンクエリはクエリの中でも比較的作成が難しいですね。
通常クエリを作成する場合は「クエリウィザード」か「クエリデザイン」
から作成すれば、ほぼ自動的に作成できますね。
しかしユニオンクエリはSQLビューで記述していく必要があります。
SQLビューというのはどのようなものか例を表示します。
以前使用した「切手在庫管理」で「Q_在庫数」というクエリがあります。

このようなものでしたね。
これを「SQLビュー」にします。

「表示」の部分で「SQLビュー」を選択します。
すると画面が右のような画面になりましたね。これがSQLです。
このようなものを自分で記述していく必要があります。
「SELECT Q_全入庫.種類, Q_全入庫.入庫数の合計, Q_全出庫.出庫数の合計,
[入庫数の合計]-[出庫数の合計] AS 在庫数
FROM Q_全入庫 INNER JOIN Q_全出庫 ON Q_全入庫.
種類 = Q_全出庫.種類
GROUP BY Q_全入庫.種類, Q_全入庫.入庫数の合計,
Q_全出庫.出庫数の合計,
[入庫数の合計]-[出庫数の合計];」ここに書かれている内容は
この通りです。
内容に関して、今は説明しません。
ユニオンクエリを説明している中で理解できてくると思います。

どのような時にユニオンクエリを使用するのか?

例えばExcelファイルで上のように2016年度と2017年度で別ファイルが
あったとします。
これを結合するのは簡単ですね。
どちらかのデータを行コピーして別のファイルに張り付ければOKです。

ここでAccessの場合はどうか考えてみましょう。
Accessで「T_2016入出庫」と「T_2017入出庫」の二つのテーブルが
あった場合どうすれば結合できるか考えてください。

クエリデザインで上記のようにしたとして、ここからどうしますか?
両方のテーブルから各項目を選択したとして、横に並ぶだけですね。
縦には結合できないですね。
このような時に「ユニオンクエリ」を使用します。
【国認定】不用PCの宅配便回収<リネットジャパン>

「ユニオンクエリの作り方」
まず、クエリデザインを選択します。
「テーブルの表示」が出ますが、「閉じて」ください。

リボンの「SQL表示」か「ユニオン」ボタンかどちらかを押してください。
若干表示内容が違います。SQL表示を押した場合で作成していきましょう。
「SQL表示」を押してください。

上記のように「SELECT;」という内容になりますね。
この「SELECT」と「;」の間に記述していきます。
この「SELECT」と「;」は既定です。
先ほどのリボンのボタンで「ユニオン」を押した場合、
このこの「SELECT」と「;」は記述されていません。
白紙の状態でスタートします。
最初に複数テーブルを結合する場合の条件を考える必要があります。
各テーブルのフィールド名とフィールド数が同じ場合。
この場合は「追加クエリ」を使用することもできると思います。
また各テーブルのフィールド名とフィールド数が違う場合。
この場合はユニオンクエリでしか結合できません。
基本のユニオン
2つの同じフィールドのテーブルを結合する場合。
SELECT * FROMテーブル1
UNION SELCT * FROMテーブル2;
上記のようになります。
もしテーブルが3つあれば同じようにして「テーブル3」を
追記すればOKです。

SELECT * FROM T_2016入出庫
UNION SELECT * FROM T_2017入出庫;
上記のように記述しました。
これで「通常表示」にしてみましょう。

上記のように2016年度と2017年度が結合されて表示されています。
ユニオンクエリはこのように使用します。
項目を指定して作成することもできます。
上記の中から「ID」と「購入先」と「出庫先」を省いてみましょう。

SELECT T_2016入出庫.日付,T_2016入出庫.種類,T_2016入出庫.入庫数,
T_2016入出庫.出庫数
FROM T_2016入出庫
UNION SELECT T_2017入出庫.日付,T_2017入出庫.種類,T_2017入出庫.
入庫数,T_2017入出庫.出庫数
FROM T_2017入出庫;
今度は少し記述内容が違いますね。
最初に表示したいフィールドを選択します。
「T_2016入出庫.日付,T_2016入出庫.種類,T_2016入出庫.入庫数,
T_2016入出庫.出庫数」の部分ですね。
「テーブル名.フィールド名」と記述して「,」で区切ります。
フィールド名が選択出来たら「FROM T_2016入出庫」で
どのテーブルから選択するのかを記述します。
その下の2017年度分は同じ内容ですね。
この状態で通常表示にします。

「ID」と「購入先」と「出庫先」が無くなっていますね。
そしてこの下に2017年度分が結合されています。
アメコミ映画を観るなら<U-NEXT>


次はフィール名を変更したい場合。
名前を変更したい場合というのは結構あります。
その場合はどうするのか。
例として「日付」を「日」だけに変更してみましょう。
SELECT T_2016入出庫.日付 AS 日,T_2016入出庫.種類,
T_2016入出庫.入庫数,T_2016入出庫.出庫数
FROM T_2016入出庫
UNION SELECT T_2017入出庫.日付 AS 日,T_2017入出庫.種類,
T_2017入出庫.入庫数,T_2017入出庫.出庫数
FROM T_2017入出庫;
上記のようにします。
「T_2016入出庫.日付 AS 日」とありますね。
これは日付という名前を日に変更する場合「元のフィールド名」+
「AS」+「新しいフィールド名」で変更できます。

上記のように日付が日になっていますね。
2つ以上のテーブルでたまたま名称が違うときとか、
名前を変更したい時などに便利です。

※ フィールド数が違う場合
たまにフィールド数が違うが結合させたいという時があります。
これもExcelなら簡単ですね。
例としてT_2016年入出庫の備考欄を削除します。
そのうえで結合したいと思います。
SELECT T_2016入出庫.ID,T_2016入出庫.日付,T_2016入出庫.種類,
T_2016入出庫.入庫数,T_2016入出庫.出庫数,T_2016入出庫.購入先,
T_2016入出庫.出庫先,NULL AS 備考
FROM T_2016入出庫
UNION SELECT T_2017入出庫.ID,T_2017入出庫.日付,T_2017入出庫.種類,
T_2017入出庫.入庫数,T_2017入出庫.出庫数,T_2017入出庫.購入先,
T_2017入出庫.出庫先,T_2017入出庫.備考
FROM T_2017入出庫;
上記のように記述します。
T_2016入出庫の最後の部分「T_2016入出庫.出庫先,NULL AS 備考」ですが、
「出庫先」の後に「NULL AS 備考」とあります。
ここがT_2016入出庫に無い部分なので「NULL」にします。
そしてその「NULLに「備考」というフィールド名を付けたということです。

上記のようになりました。
また抽出とかを行いたいときも可能です。
ユニオンクエリで2つのテーブルを結合して「82円」だけ抽出したいと
思います。
SELECT T_2016入出庫.ID,T_2016入出庫.日付,T_2016入出庫.種類,
T_2016入出庫.入庫数,T_2016入出庫.出庫数,T_2016入出庫.購入先,
T_2016入出庫.出庫先,NULL AS 備考
FROM T_2016入出庫
WHERE ((T_2016入出庫.種類)=82)
UNION
SELECT T_2017入出庫.ID,T_2017入出庫.日付,T_2017入出庫.種類,
T_2017入出庫.入庫数,T_2017入出庫.出庫数,T_2017入出庫.購入先,
T_2017入出庫.出庫先,T_2017入出庫.備考
FROM T_2017入出庫
WHERE ((T_2017入出庫.種類)=82);
抽出の場合はWHERE ((T_2017入出庫.種類)=82)のように「WHERE」を
使用します。

上記のように2つのテーブルが結合され、82円だけ抽出されました。
次に並べ替えを追加したいと思います。
上記のユニオンクエリに日付順の並べ替えを追記します。
SELECT T_2016入出庫.ID,T_2016入出庫.日付,T_2016入出庫.種類,
T_2016入出庫.入庫数,T_2016入出庫.出庫数,T_2016入出庫.購入先,
T_2016入出庫.出庫先,NULL AS 備考
FROM T_2016入出庫
WHERE ((T_2016入出庫.種類)=82)
UNION
SELECT T_2017入出庫.ID,T_2017入出庫.日付,T_2017入出庫.種類,
T_2017入出庫.入庫数,T_2017入出庫.出庫数,T_2017入出庫.購入先,
T_2017入出庫.出庫先,T_2017入出庫.備考
FROM T_2017入出庫
WHERE ((T_2017入出庫.種類)=82)
ORDER BY 日付;
最後に「ORDER BY 日付」を追記しました。
日付を並べ替えしなさいという記述です。

上記のように日付順に並びました。
他の選択クエリとかクロス集計クエリとかありますが、
すべて「SQLビュー」で確認できます。
SQLビューで書かれているような記述をすれば同じ結果がでます。
まあクエリウィザードとかクエリデザインでできるクエリはそちらを
使用しましょう。
どうしてもできない場合だけユニオンクエリを利用することにしましょう。
ユニオンクエリは是非覚えてください。
世界中8000万人が利用する話題のホテル検索サイト『トリバゴ』


【追加クエリ】
ユニオンクエリの途中で追加クエリという名前を出しました。
これもついでに紹介しておきましょう。
通常のクエリデザインから作成します。
条件として同じフィールド数で同じフィールド名ということで
作成いたします。
ユニオンクエリで使用したT_2016入出庫とT_2017入出庫を使用します。
今回はどちらも備考欄は省いています。
とりあえず
T_2017入出庫を選択してすべての項目を選択してください。

リボンの「追加」というボタンを押してください。
「追加」というボックスが出てきますので「テーブル名」で
T_2016入出庫を選択して「OK」を押してください。

レコードの追加という行が出てきますね。
一応「ID」はオートナンバー型なので赤丸部分は消しておきましょう。
そしてリボン左上にある「実行!」を押してください。
そして通常表示にしてください。

2017年の下に2016年のレコードが追加されていますね。
これが追加クエリです。
大体ここまででクエリについて紹介してきたつもりです。
Accessの心臓部はクエリです。
あらゆる加工について、ほぼクエリで実行できると思ってください。
クエリでの計算等もあまり紹介していませんが、様々な計算ができます。
例えば生年月日というフィールドがあり、クエリで「年齢」という
フィールドを追加します。
そこに「年齢: DateDiff("yyyy",[生年月日],Now())-1」という式を
挿入すると「年齢」が表示されます。
Access用の関数が用意されていますので、
その関数を使用して様々な計算ができます。
そのあたりは「何がしたいか」という明確なものがあればネットで
探せばいくらでも出てきます。
そうやって自分で勉強していけば実力がついてくると思います。

■□■━━━━━━━━━━━━━━━━━━━━━━━━
+++ 月額1,980円(1年間・税別)で使えるスマホ【UQmobile】 +++
https://px.a8.net/svt/ejp?a8mat=2TIIN2+9W1A2Q+2CPQ+1BQJAB
------------------------------------------------------
・番号そのままお乗換え可能!
・当サイト限定初期費用&送料無料!
・0円端末など豊富なラインナップ!
━━━━━━━━━━━━━━━━━━━━━━━━■□■
【このカテゴリーの最新記事】
この記事へのトラックバックURL
https://fanblogs.jp/tb/8583477
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック
とても分かりやすく、Accessの勉強になっています。
これからも陰ながら応援させていただきます。