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.列名;