- ベストアンサー
同じ構成のテーブルの条件付き結合
- 同じ構成のテーブルを条件付きで結合し、6つのテーブルを集計するSQLを作成しています。
- テーブルのカラムはID、名前、日付1、日付2、ステータス1、ステータス2です。
- IDの一覧を作成し、重複したIDがあればテーブル番号が若い方の名前を残すようにしています。日付1は最古の日付、日付2は最新の日付とし、ステータスは優先順位1>2>0>nullの順に優先して残します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ステータスを順位付けするテーブルを作るとよいかと /* 初期値 - 検証のためテーブル1のデータを増やしてます */ create table テーブル1(ID int,名前 varchar(20),日付1 date,日付2 date,ステータス1 int null,ステータス2 int null); create table テーブル2(ID int,名前 varchar(20),日付1 date,日付2 date,ステータス1 int null,ステータス2 int null); create table テーブル3(ID int,名前 varchar(20),日付1 date,日付2 date,ステータス1 int null,ステータス2 int null); insert into テーブル1 values(111,'あああ','2001/1/1','2001/1/1',2,2),(222,'いいい','2001/1/1','2001/1/1',2,2),(333,'ううう','2001/1/1','2001/1/1',null,null),(555,'おおお','2001/1/1','2001/1/1',2,2),(666,'かかか','2001/1/1','2001/1/1',null,0); insert into テーブル2 values(111,'aaa','2002/2/2','2002/2/2',0,null),(222,'iii','2002/2/2','2002/2/2',1,0),(333,'uuu','2002/2/2','2002/2/2',null,null),(444,'eee','2002/2/2','2002/2/2',1,1); insert into テーブル3 values(111,'あああ','2001/1/1','2002/2/2',2,2),(222,'いいい','2001/1/1','2002/2/2',1,2),(444,'eee','2002/2/2','2002/2/2',1,1),(555,'おおお','2001/1/1','2001/1/1',2,2); /* ステータスの順位付けテーブルを作る */ create table ステータス(status int null,rank int); insert into ステータス values(1,1),(2,2),(0,3) /* 集計 */ select ID,日付1,日付2,st3.status as ステータス1,st4.status as ステータス2 from( select ID,MIN(日付1) AS 日付1,MAX(日付2) AS 日付2 ,MIN(st1.rank) as r1 ,MIN(st2.rank) as r2 from ( select * from テーブル1 union all select * from テーブル2 union all select * from テーブル3 ) uni1 left join ステータス as st1 on uni1.ステータス1=st1.status left join ステータス as st2 on uni1.ステータス2=st2.status GROUP BY ID having r1 is not null or r2 is not null ) uni2 left join ステータス as st3 on uni2.r1=st3.rank left join ステータス as st4 on uni2.r2=st4.rank
お礼
あ、昨日に引き続きありがとうございます。 おかげさまで完成させることが出来ました。