質問: 同じ構成のテーブルの条件付き結合 同じ構成のテーブルがテーブル1~テーブル6まであり、6つのテーブルを集計するsqlを作成しています。 カラムは id、名前、日付1、日付2、ステータス1、ステータス2 です。 idがプライマリーキーになっており、テーブル1にしかないidや全てのテーブルに登録されているidなどもあり、idの一覧を作成したいです。 idが重複していた場合、名前はどれを残しても構わないのですが(どのテーブルか指定する必要があるのならばとりあえずテーブル番号が若い方の名前を残すようにしてください。) 日付1は最古の日付 日付2は最新の日付 ステータスは共に優先順位が1>2>0>nullとなっており優先順位が高いほうを残すようにし、ステータスが両方nullの場合は集計しないようにしたいです。 テーブル1 id、名前、日付1、日付2、ステータス1、ステータス2 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 テーブル2 id、名前、日付1、日付2、ステータス1、ステータス2 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 結果 id、名前、日付1、日付2、ステータス1、ステータス2 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 このようなことを6つのテーブルを集計して行いたいです。 select t1.id,min(t1.日付1)as 日付1,max(t1.日付2)as 日付2,case when t1.ステータス1="1" then "1" else t1.ステータス1 end ,case when t1.ステータス2="1" then "1" else t1.ステータス2 end from( select * from テーブル1 union all select * from テーブル2 union all select * from テーブル3 union all select * from テーブル4 union all select * from テーブル5 union all select * from テーブル6 )as t1 where not(t1.ステータス1 is null and t1.ステータス2 is null) group by id 日付は出来ていると思うのですが、ステータスで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