質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

586閲覧

Access 多対多の結合数のカウント方法(複数テーブル)

s_tom

総合スコア5

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2021/10/26 10:10

お世話になります。

先日類似の相談をさせていただいたのですが、それの応用方法についてご相談があります。

以下Table1とTable2をインプットとして、Table3を出力したいです。
「項目1」同士が、それぞれ同じ「項目2」「項目3」にいくつ関連しているかをカウントし出力したいです。

Table1からTable3の一部、Table2からTable3の一部を出すことは可能なのですが、
あわせ技で一括で出す方法があればご教示いただきたいです。
クエリ、またSQLで実現したいと考えております。
ご教示の程よろしくお願いいたします。

【Table1】        
項目1 項目2
sys1 A
sys2 A
sys3 A
sys1 B
sys2 B
sys1 C
sys3 C
sys1 D
sys3 D

【Table2】        
項目1 項目3
sys1 a
sys2 a
sys4 a
sys1 b
sys4 b

【Table3】        
項目4 項目5 項目6 項目7
sys1 sys2 2 1
sys1 sys3 3
sys2 sys3 1
sys1 sys4 2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2021/10/26 13:17

そもそも、多対多とは特定できない事を意味しますので、そのような設計はするべきではありません。
s_tom

2021/10/27 02:13

@saziさん おっしゃる通りだと思います。 ただ、複雑に関連している状態のものがあり、結合度合いを算出する必要があるため質問させていただきました。
guest

回答1

0

ベストアンサー

Access - Access 多対多の結合数のカウント方法|teratail
上記の質問の続きですね。

上記の回答のSQLでそれぞれのテーブルからクエリを作成します。

Q1

sql

1SELECT a.項目1 AS 項目4, b.項目1 AS 項目5, Count(*) AS 項目6 2FROM Table1 AS a INNER JOIN Table1 AS b ON a.項目2 = b.項目2 3WHERE a.項目1<b.項目1 4GROUP BY a.項目1, b.項目1;

Q2

sql

1SELECT a.項目1 AS 項目4, b.項目1 AS 項目5, Count(*) AS 項目7 2FROM Table2 a INNER JOIN Table2 b ON a.項目3 = b.項目3 3WHERE a.項目1<b.項目1 4GROUP BY a.項目1, b.項目1;

この2つのクエリを完全外部結合 (FULL OUTER JOIN)で結合すれば希望の結果になりますが、
残念ながら、AccessはFULL OUTER JOINをサポートしてません。

そこで、工夫が必要です。いろいろ方法はありますが、ユニオンクエリとクロス集計クエリを使う例を出しておきます。

QUnion

sql

1SELECT 項目4, 項目5, "項目6" AS 列名, 項目6 AS 件数 2FROM Q1 3UNION ALL 4SELECT 項目4, 項目5, "項目7" AS 列名, 項目7 AS 件数 5FROM Q2;

QCross

sql

1TRANSFORM Sum(QUnion.件数) AS 件数の合計 2SELECT QUnion.項目4, QUnion.項目5 3FROM QUnion 4GROUP BY QUnion.項目4, QUnion.項目5 5PIVOT QUnion.列名;

クエリ4つになりましたが、サブクエリを使って一つに纏めることはできます。
が、メンテナンスとか考えたら分けておいた方がいいと思いますが、一応、纏めたものの提示しておきます。

sql

1TRANSFORM Sum(QUnion.件数) AS 件数の合計 2SELECT QUnion.項目4, QUnion.項目5 3FROM ( 4 SELECT 項目4, 項目5, "項目6" AS 列名, 項目6 AS 件数 5 FROM ( 6 SELECT a.項目1 AS 項目4, b.項目1 AS 項目5, Count(*) AS 項目6 7 FROM Table1 AS a INNER JOIN Table1 AS b ON a.項目2 = b.項目2 8 WHERE a.項目1<b.項目1 9 GROUP BY a.項目1, b.項目1 10 ) Q1 11 UNION ALL 12 SELECT 項目4, 項目5, "項目7" AS 列名, 項目7 AS 件数 13 FROM ( 14 SELECT a.項目1 AS 項目4, b.項目1 AS 項目5, Count(*) AS 項目7 15 FROM Table2 a INNER JOIN Table2 b ON a.項目3 = b.項目3 16 WHERE a.項目1<b.項目1 17 GROUP BY a.項目1, b.項目1 18 ) Q2 19) QUnion 20GROUP BY QUnion.項目4, QUnion.項目5 21PIVOT QUnion.列名;

投稿2021/10/26 15:18

編集2021/10/27 00:42
hatena19

総合スコア33795

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_tom

2021/10/27 02:11

@hatena19さん 先日に続きご回答いただきありがとうございます。 (実装と、データ量が多く処理に時間を要していました) 解決しました! 大変助かりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問