回答編集履歴

2 推敲

sazi

sazi score 23148

2021/05/30 19:10  投稿

①に対して、集計するというのがクエリーでは実現されていません。
**union **は**マージ**する機能で**集計**ではありません。
件数については、クエリーの性能を気にされていると思いますが、それは正しいクエリーであると同時に、インデックスも適切でなければなりません。
②について、table_joinとlink_tableの関係はidで1:n(※)なのでしょう。
これに対し、yearとtagではn:nになるので、件数が変わるのは当然です。
※テーブルが分かれているのが正しいなら1:nですが、1:1なら正規化されている状態ではありません。
やりたいことは概ね以下の様なSQLだと思います。
やりたいは概ね以下の様なSQLだと思います。
```SQL
select a.year, a.tag, sum(a_data1), sum(b_data2), sum(b_data1), sum(b_data2)
from table_join a inner join link_table c
     on a.id=c.id
where c.file_name = 'ほげほげ.xlsx'
 and c.sheet_name = 'a'
 and c.year >= 2015
group by a.year, a.tag
```
1 追記

sazi

sazi score 23148

2021/05/30 12:21  投稿

①に対して、集計するというのがクエリーでは実現されていません。
**union **は**マージ**する機能で**集計**ではありません。
件数については、クエリーの性能を気にされていると思いますが、それは正しいクエリーであると同時に、インデックスも適切でなければなりません。
②について、table_joinとlink_tableの関係はidで1:1なのでしょう。
②について、table_joinとlink_tableの関係はidで1:n(※)なのでしょう。
これに対し、yearとtagではn:nになるので、件数が変わるのは当然です。
※テーブルが分かれているのが正しいなら1:nですが、1:1なら正規化されている状態ではありません。  
やりたいことは概ね以下の様なSQLだと思います。
```SQL
select a.year, a.tag, sum(a_data1), sum(b_data2), sum(b_data1), sum(b_data2)
from table_join a inner join link_table c
     on a.id=c.id
where c.file_name = 'ほげほげ.xlsx'
 and c.sheet_name = 'a'
 and c.year >= 2015
group by a.year, a.tag
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る