トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-77 結合して、同上をnullに変換

SQLパズル

table1テーブル
EmpID  Email
-----  -----------
00001  aa@test.com
00002  bb@test.com

table2テーブル
EmpID  Value1  Value2
-----  ------  ------
00001  AB      123
00001  CD      345
00001  DF      455
00002  AA      089
00002  BB      999

下記の出力をする

出力結果
EmpID  Email        Value1  Value2
-----  -----------  ------  ------
00001  aa@test.com  AB      123
null   null         CD      345
null   null         DF      455
00002  bb@test.com  AA      089
null   null         BB      999

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table table1(
EmpID char(5),
Email char(11));

insert into table1 values('00001','aa@test.com');
insert into table1 values('00002','bb@test.com');

create table table2(
EmpID  char(5),
Value1 char(2),
Value2 char(3));

insert into table2 values('00001','AB','123');
insert into table2 values('00001','CD','345');
insert into table2 values('00001','DF','455');
insert into table2 values('00002','AA','089');
insert into table2 values('00002','BB','999');
commit;


SQL

select
case Row_Number() over(partition by a.EmpID order by b.Value1,b.Value2)
when 1 then a.EmpID end as EmpID,
case Row_Number() over(partition by a.EmpID order by b.Value1,b.Value2)
when 1 then a.Email end as Email,
b.Value1,b.Value2
 from table1 a,table2 b
where a.EmpID = b.EmpID
order by a.EmpID,b.Value1,b.Value2;


解説

case式とRow_Number関数を組み合わせてます